我在将java对象序列化为XML时遇到问题。我的课程如下所示:
@Root(strict = false, name = "Detail")
public class ProductList {
@ElementList(inline = true, entry = "Product")
private List<Product> products;
}
@Root(strict = false)
public class Product {
@Element(name = "ProductCode")
private String productCode;
@Element(name = "ProductPrice")
private double productPrice;
@Element(name = "Currency")
private String currency;
@Element(name = "ConversionRate")
private int conversionRate;
@Element(name = "ProductPoints", required = false)
private int productPoints;
@Element(name = "ProductCount", required = false)
private int productCount;
@Element(name = "ProductName", required = false)
private String productName;
@Element(name = "MinPrice", required = false)
private double minPricet;
@Element(name = "MaxPrice", required = false)
private double maxPricet;
@Element(name = "CanChangePrice", required = false)
private String canChangePrice;
}
下面的XML是从服务器发送的,它的反序列化没有任何问题:
<?xml version="1.0" encoding="UTF-8"?>
<Detail>
<Product>
<ProductCode>0001</ProductCode>
<ProductPrice>0.90</ProductPrice>
<Currency>GEL</Currency>
<ConversionRate>200</ConversionRate>
<ProductName>Bread</ProductName>
<MinPrice>0.9</MinPrice>
<MaxPrice>0.9</MaxPrice>
<CanChangePrice>N</CanChangePrice>
</Product>
<Product>
...
</Product>
</Detail>
我尝试生成具有此结构的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<Detail>
<Product>
<ProductCode>0001</ProductCode>
<ProductPrice>0.90</ProductPrice>
<Currency>GEL</Currency>
<ConversionRate>200</ConversionRate>
<ProductPoints>180</ProductPoints>
<ProductCount>1</ProductCount>
</Product>
<Product>
...
</Product>
</Detail>
但我明白了:
<Detail>
<Product>
<ProductCode>0001</ProductCode>
<ProductPrice>0.9</ProductPrice>
<Currency>GEL</Currency>
<ConversionRate>200</ConversionRate>
<productPoints>180</productPoints>
<ProductCount>1</ProductCount>
<ProductName>Bread</ProductName>
<MinPrice>0.9</MinPrice>
<MaxPrice>0.9</MaxPrice>
<CanChangePrice>N</CanChangePrice>
</Product>
<Product>
...
</Product>
</Detail>
标记<ProductName>
,<MinPrice>
,<MaxPrice>
,<CanChangePrice>
不得包含在序列化的XML中。
有什么方法可以告诉框架在序列化时不要包含特定的标签\变量?
答案 0 :(得分:2)
您的班级成员未初始化为null
,因此required=false
没有不序列化他们的效果。
int
由org.simpleframework.xml.transform.IntegerTransform
序列化。这个类的write(Integer)
方法很简单:
public String write(Integer value) {
return value.toString();
}
如您所见,使用了简单的自动装箱。
int
由构造函数初始化为0
。Integer
。String
的{{1}}值为Integer
,不 "0"
。为您的班级成员使用null
,而不是Integer
。
如果您不想序列化成员,请不要使用int
对其进行注释。简单的不是“生成”XML,而是关于将实例映射到XML或从XML映射实例。您要映射的每个成员都需要注释。每个带注释的成员都将被映射。
答案 1 :(得分:0)
我的解决方案非常难看。我为XML序列化创建了另一个类,它包含原始类中的每个字段,除了我想在XML中省略的字段。
答案 2 :(得分:0)
您可以使用converter覆盖默认序列化机制来自定义输出。例如,您提供的将是:
public class CustomProductConverter implements Converter<Product> {
private void createProductPropertyNode(OutputNode productNode, String propertyName, String value) throws Exception {
productNode.getChild(propertyName).setValue(value);
}
private void createProductPropertyNode(OutputNode productNode, String propertyName, int value) throws Exception {
createProductPropertyNode(productNode, propertyName, String.valueOf(value));
}
private void createProductPropertyNode(OutputNode productNode, String propertyName, double value) throws Exception {
createProductPropertyNode(productNode, propertyName, String.valueOf(value));
}
@Override
public Product read(InputNode inputNode) throws Exception {
throw new UnsupportedOperationException();
}
@Override
public void write(OutputNode outputNode, Product product) throws Exception {
createProductPropertyNode(outputNode, "ProductCode" , product.getProductCode());
createProductPropertyNode(outputNode, "ProductPrice" , product.getProductPrice());
createProductPropertyNode(outputNode, "Currency" , product.getCurrency());
createProductPropertyNode(outputNode, "ConversionRate", product.getConversionRate());
createProductPropertyNode(outputNode, "ProductPoints" , product.getProductPoints());
createProductPropertyNode(outputNode, "ProductCount" , product.getProductCount());
outputNode.commit();
}
}
然后使用 RegistryStrategy 进行序列化:
Registry registry = new Registry();
registry.bind(Product.class, CustomProductConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
// serialize your object with serializer
PROS :您可以使用不同的转换器动态序列化相同的对象,并在不修改模型类的情况下获得不同的输出。
CONS :在复杂模型的情况下,转换器中会有很多类似的代码。