【发布时间】:2020-03-09 14:56:18
【问题描述】:
我的数据最好被描述为“洋葱状”,因为每个外层都建立在它下面的一层之上。下面您将看到一个大大简化的版本(我的版本更深几层,但在每个级别都表现出相同的行为)。
[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 的实例,并使用ObservableCollection 附带的.Add 向其中添加Test 对象。
当我序列化和反序列化这个结构时,我得到以下内容
<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>
输出已离开TestGroup 中的DataMembers。随着我对洋葱的深入了解,不包括更高的DataMembers(即使来自抽象类)。我尝试将[KnownType(typeof(TestGroup))] 添加到TestGroup 和AbstractTestGroup 均未成功。
问题:为什么我不能序列化TestGroup类中的DataMemberWhy?
后续问题:是否有另一种方法来序列化和反序列化这种形状的结构?我计划在本地使用输出来“加载”用户指定的配置。如果可以避免的话,我宁愿不必指定自己的序列化方案。
对于那些感兴趣的人来说,我是如何生成类、序列化和反序列化的。
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 并遇到同样的问题。
【问题讨论】:
标签: c# serialization datacontractserializer datacontract