c# - DataContract 无法序列化集合成员

标签 c# serialization datacontractserializer datacontract

我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每一层都表现出相同的行为)。

[CollectionDataContract]
public abstract class AbstractTestGroup : ObservableCollection<AbstractTest>
{
    [DataMember]
    public abstract string Name { get; set; }
}

[CollectionDataContract]
[KnownType(typeof(Test))]
public class TestGroup : AbstractTestGroup
{
    public override string Name
    {
        get { return "TestGroupName"; }
        set { }
    }

    [DataMember]
    public string Why { get { return "Why"; } set { } }
}

[DataContract]
public abstract class AbstractTest
{
    [DataMember]
    public abstract string SayHello { get; set; }
}


[DataContract]
public class Test : AbstractTest
{
    //Concrete class - members in this class get serialized
    [DataMember]
    public string Month { get { return "June"; } set { } }

    public override string SayHello { get { return "HELLO"; } set { } }
}

我创建了一个 TestGroup 的实例并添加 Test使用 .Add 反对它ObservableCollection 附带的.

当我序列化和反序列化这个结构时,我得到以下结果

<TestGroup xmlns="http://schemas.datacontract.org/2004/07/WpfApplication2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <AbstractTest i:type="Test">
        <SayHello>HELLO</SayHello>
        <Month>June</Month>
    </AbstractTest>
</TestGroup>

输出已离开 DataMemberTestGroup .当我深入洋葱时,没有 DataMember包括更高的 s(甚至来自抽象类)。我试过添加 [KnownType(typeof(TestGroup))]到两个TestGroupAbstractTestGroup没有成功。

问题:为什么我无法序列化 DataMember WhyTestGroup类(class)?

跟进问题:是否有其他方法可以序列化和反序列化这种形状的结构?我计划在本地使用输出来“加载”用户指定的配置。如果可以避免,我宁愿不必指定自己的序列化方案。


对于那些感兴趣的人,这里是我如何生成类、序列化和反序列化它。

TestGroup tg = new TestGroup();
tg.Add(new Test());

DataContractSerializer ser = new DataContractSerializer(typeof(TestGroup));
MemoryStream memoryStream = new MemoryStream();
ser.WriteObject(memoryStream, tg);

memoryStream.Seek(0, SeekOrigin.Begin);
string str;
using (StreamReader sr = new StreamReader(memoryStream))
    str = sr.ReadToEnd();

编辑:为了值得,我尝试更改为使用 Serializable相反,并有同样的问题。

最佳答案

之所以没有序列化属性Why,是因为TestGroup是一个集合。 DataContract 对集合进行特殊处理。最终结果是只存储集合中的数据,不存储任何属性。

列表以任何其他列表都可以读取的方式存储。唯一的区别是集合和字典之间的区别。一个很好的引用是 http://msdn.microsoft.com/en-us/library/aa347850%28v=vs.110%29.aspx

关于c# - DataContract 无法序列化集合成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17091313/

相关文章:

c# - DataContractSerializer 和不可变类型。反序列化为已知对象实例

wcf - 首先使用实体​​框架代码进行空集合

c# - DataContract 无法序列化集合成员

c# - 如何携带在 Asp.net MVC 中选择的下拉值

c# - 升级到 EntityFramework 6.1.3,现在收到上下文异常

c# - 在VS 2008中添加dll

c# - Windows XP 中的重叠控件

jQuery仅序列化div中的元素

php - Swift、php 和 unicode 字符

python - 有谁知道哪里有序列化数据并在输出中保留其顺序的方法?