简单的框架。不要将某些变量序列化为xml

时间:2013-10-19 16:43:29

标签: java xml simple-framework

我在将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中。

有什么方法可以告诉框架在序列化时不要包含特定的标签\变量?

3 个答案:

答案 0 :(得分:2)

问题

您的班级成员初始化为null,因此required=false没有序列化他们的效果。

intorg.simpleframework.xml.transform.IntegerTransform序列化。这个类的write(Integer)方法很简单:

public String write(Integer value) {
   return value.toString();
}

如您所见,使用了简单的自动装箱。

  1. 您的原始int由构造函数初始化为0
  2. 它被装入Integer
  3. String的{​​{1}}值为Integer "0"
  4. 解决方案

    为您的班级成员使用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 :在复杂模型的情况下,转换器中会有很多类似的代码。