【问题标题】:DataContractSerializer ignores fields in subclass of CollectionsDataContractSerializer 忽略 Collections 子类中的字段
【发布时间】:2016-10-26 05:47:14
【问题描述】:

我一直在尝试序列化一个继承自 List<int> 并具有提供额外信息的字段的类(见下文)。

最初,我一直在使用XmlSerializer,但在那里我也遇到了问题。

根据this post 的设计,XmlSerializer 不会序列化字段,但DataContractSerializer 应该可以工作。

任何建议将不胜感激!

[CollectionDataContract]
public class Group : List<int>
{
    [DataMember]
    public string Key { get; set; }
}

static void Main()
{
    Group test = new Group { Key = "Test key" };
    test.Add(60);

    DataContractSerializer serializer = new DataContractSerializer(typeof(Group));
    MemoryStream stream = new MemoryStream();

    serializer.WriteObject(stream, test);

    stream.Position = 0;
    test = serializer.ReadObject(stream) as Group;
    Console.WriteLine("{0}: {1}", test.Key ?? "No luck", test[0]);
}

谢谢, 诺亚

【问题讨论】:

    标签: c# serialization collections subclass datacontractserializer


    【解决方案1】:

    这是预期的行为。当从集合派生时,只有基类会被序列化:) 我建议创建一个基包装类。

    [DataContract]
    class SuperWrapper {
        private List<int> _myList;
        private string _name;
    
        [DataMember]
        public List<int> Items { get { return _items; } set { _items = value; } }
    
        [DataMember]
        public string Name { get { return _name; } set { _name = value; } }
    }
    

    【讨论】:

    • 不幸的是,我需要以这种方式公开对象。我想我必须实现一个包装器来提供我需要的接口,然后序列化的一部分必须是把对象变成你提到的东西。谢谢!
    【解决方案2】:

    您需要创建一个包含所有对象或属性的 DTO

    [DataContract]
    class ResponseDTO 
    {
    
        [DataMember]
        public List<int> ListData{ get ;set; }
    
        [DataMember]
        public string Key{  get ;set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 2017-12-15
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多