DataContractSerializer的序列化不是类的成员,它继承了ISerializable

2019-09-24 00:11发布

我有这个类:

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;

namespace Grouping
{
    [Serializable]
    public class Group<T> : HashSet<T>
    {
        public Group(string name)
        {
            this.name = name;
        }

        protected Group(){}

        protected Group(SerializationInfo info, StreamingContext context):base(info,context)
        {
            name = info.GetString("koosnaampje");
        }

        public override void GetObjectData(SerializationInfo info,StreamingContext context)
        {
            base.GetObjectData(info,context);
            info.AddValue("koosnaampje", Name);
        }

        private string name;
        public string Name
        {
            get { return name; }
            private set { name = value; }
        }
    }
}

当它从HashSet的继承了它必须实现ISerializable的,因此受保护的构造和GetObjectData方法。 以前我系列化,并与BinaryFormatter的反序列化成功地这个类。

因为我希望能够检查由我想要切换到DataContractSerializer的串行器生成的输出。

我写这个测试:

[TestMethod]
public void SerializeTest()
{
    var group = new Group<int>("ints"){1,2,3};
    var serializer = new DataContractSerializer(typeof (Group<int>));
    using (var stream=File.OpenWrite("group1.xml"))
    {
        serializer.WriteObject(stream,group);
    }
    using (var stream=File.OpenRead("group1.xml"))
    {
        group = serializer.ReadObject(stream) as Group<int>;
    }
    Assert.IsTrue(group.Contains(1));
    Assert.AreEqual("ints",group.Name);
}

因为名称属性为null,则测试失败! (整数是(德)序列化虽然正确),这是怎么回事?

编辑:这无关名为支持字段是私有的。 使其成为公众有相同的结果。

Answer 1:

这是无关ISerializable ; DataContractSerializer根本不使用 ISerializable (它会使用IXmlSerializable ,但你不想这样做...)

大多数串行,包括XmlSerializerDataContractSerializer (和数据绑定,对于这个问题),把收藏作为不同的实体。 它可以是一个另一个,但不能同时使用。 因为它检测到它是一个“集”,它系列化内容 (即无论是在集),而不是属性( Name等)。

您应该封装的集合,而不是继承它。

也; 正确使用DataContractSerializer ,这将是明智添加[DataMember] / [DataContract]属性。 例如:

[Serializable, DataContract] // probably don't need [Serializable]
public class Group<T>
{
    [DataMember]
    public HashSet<T> Items { get; private set; }

    protected Group()
    {
        Items = new HashSet<T>();
    }
    public Group(string name) : this()
    {
        Name = name;
    }
    [DataMember]
    public string Name {get ;private set;}
}


文章来源: DataContractSerializer not Serializing member of class that inherits ISerializable