【问题标题】:c# serialize nested classc# 序列化嵌套类
【发布时间】:2013-09-27 11:46:13
【问题描述】:

我正在尝试序列化一个虚拟订单集合,其中每个订单都包含一个产品。集合序列化正常,但订单中的示例产品属性丢失。

订单收集

[XmlRoot("Orders")]
public class OrderCollection : ICollection<Order>
{
    private static List<Order> _orders;

    private List<Order> Orders
    {
        get
        {
            if(_orders == null)
            {
                _orders = new List<Order>();
            }

            return _orders;
        }
    }

    //All the ICollection functions
}

订单

public class Order
{
    [XmlElement("Id")]
    public int Id
    {
        get;
        set;
    }

    [XmlElement("Title")]
    public string Title
    {
        get;
        set;
    }

    [XmlElement("IsReserved")]
    public bool IsReserved
    {
        get;
        set;
    }

    [XmlElement("Count")]
    public int Count
    {
        get
        {
            return this.Products.Count;
        }
        set
        {

        }
    }

    // not serializing
    [XmlElement("Product")]
    public Product ProductTest
    {
        get
        {
            return new Product();
        }
    }

    // not serializing
    [XmlArray("Products")]
    public ICollection<Product> Products
    {
        get
        {
            return this._products;
        }

    }

    private List<Product> _products;

    public Order()
    {
        var rand = new Random();
        var count = rand.Next(1, 5);
        this._products = new List<Product>();

        for (int i = 0; i < count; i++)
        {
            this._products.Add(new Product());
        }
    }
}

产品

[Serializable]
public class Product 
{
    [XmlElement("Id")]
    public int Id
    {
        get;
        set;
    }

    [XmlElement("Title")]
    public string Title
    {
        get;
        set;
    }

    public Product()
    {
        var rand = new Random();
        this.Id = rand.Next(100, 9999);
        this.Title = "Product " + this.Id;
    }
}

输出

<?xml version="1.0"?>
<Orders xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Order>
    <Id>619883</Id>
    <Title>Order 619883</Title>
    <IsReserved>false</IsReserved>
    <Count>3</Count>
  </Order>
  <Order>
    <Id>961448</Id>
    <Title>Order 961448</Title>
    <IsReserved>false</IsReserved>
    <Count>3</Count>
  </Order>
  <Order>
    <Id>483677</Id>
    <Title>Order 483677</Title>
    <IsReserved>false</IsReserved>
    <Count>2</Count>
  </Order>
  <Order>
    <Id>512026</Id>
    <Title>Order 512026</Title>
    <IsReserved>false</IsReserved>
    <Count>2</Count>
  </Order>
  <Order>
    <Id>916029</Id>
    <Title>Order 916029</Title>
    <IsReserved>false</IsReserved>
    <Count>4</Count>
  </Order>
  <Order>
    <Id>109800</Id>
    <Title>Order 109800</Title>
    <IsReserved>false</IsReserved>
    <Count>4</Count>
  </Order>
</Orders>

我完全感到困惑。深度序列化似乎正在工作,因为否则订单不会在 OrderCollection 中序列化,但随后它就会停止。有什么建议吗?

【问题讨论】:

  • 我认为[XmlElement("Products")] public ICollection&lt;Product&gt; Products 应该是[XmlArray("Products")] public ICollection&lt;Product&gt; Products msdn.microsoft.com/en-us/library/…
  • 我已经尝试过了,为了排除它,我添加了一个也没有序列化的 ProductTest 属性。
  • 尝试放弃所有额外的代码。将您的类创建为 simple plain-old-CLR-objects。没有空设置器,没有 get-only 属性,没有什么花哨的,看看会发生什么。 (另外,为什么支持字段private static List&lt;Order&gt; _orders; 是静态的?)对于您的XML 序列化,您最好只拥有一个表示您的XML 模式的简单数据模型。如果您想添加业务/逻辑/验证,请通过转换到/从不关心序列化问题的内部业务类来单独执行。
  • 您是否已将 XmlRoot 属性应用于所有类? [XmlRoot("Product")]

标签: c# xml serialization


【解决方案1】:

您必须将 ICollection 更改为 List。接口不可序列化。

[XmlArray("Products")]
public List<Product> Products
{
    get
    {
        return this._products;
    }

}

由于缺少 setter,ProductTest 无法工作

【讨论】:

  • 太好了,这行得通。谢谢。不过问题是,我很确定代码分析会抱怨有一个公共列表而不是 ICollection - 那么在那里最好做什么呢?
  • 您可以使用集合而不是列表或禁用规则。两者都是有效的方式(在我看来)。如果你想要一个 Collection,你可以用它来创建一个新的 Collection(this._products);
【解决方案2】:

你不能序列化一个接口..

接口只不过是对一组行为的描述。它没有说明实例的内容。特别是,虽然实现接口的类的实例必须实现其所有成员,但它肯定会有自己的属性需要序列化。

PS:抄自Serializing interfaces

【讨论】:

    【解决方案3】:

    变成列表。

    公开列表产品 {

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      相关资源
      最近更新 更多