C#DataContractSerializer-反序列化列表的列表
我在反序列化xml文件中的列表时遇到问题:C#DataContractSerializer-反序列化列表的列表,c#,xml,list,datacontractserializer,C#,Xml,List,Datacontractserializer,我在反序列化xml文件中的列表时遇到问题: <?xml version="1.0" encoding="UTF-8"?> <RootLevel><!--Container--> <ListOfOne><!--List of One --> <One> <ListOfTwo> <!--List of Two --> <Two><
<?xml version="1.0" encoding="UTF-8"?>
<RootLevel><!--Container-->
<ListOfOne><!--List of One -->
<One>
<ListOfTwo> <!--List of Two -->
<Two></Two>
</ListOfTwo>
</One>
</ListOfOne>
</RootLevel>
如果删除代码的这一部分,一切都会按预期进行:
[OnDeserialized]
internal void OnSerializingMethod(StreamingContext context)
ListOfTwo = new List<Two>();
}
[OnDeserialized]
内部void OnSerializingMethod(StreamingContext上下文)
ListOfTwo=新列表();
}
如果您希望确保始终有两个空列表,请将其更改为:
[OnDeserialized]
internal void OnSerializingMethod(StreamingContext context)
{
if(ListOfTwo == null) {
ListOfTwo = new List<Two>();
}
}
[OnDeserialized]
内部void OnSerializingMethod(StreamingContext上下文)
{
if(ListOfTwo==null){
ListOfTwo=新列表();
}
}
我运行代码时做了一点小修改(不从文件中读取)
stringxml=@”
";
var stream=newmemoryStream(Encoding.Default.GetBytes(xml));
使用(var reader=XmlDictionaryReader)
.CreateTextReader(流,
新的XmlDictionaryReaderQuotas())
{
DataContractSerializer ser=新的DataContractSerializer(typeof(RootLevel));
var deserializedPerson=(RootLevel)ser.ReadObject(reader,true);
Assert.IsTrue(反序列化person.ListOfOne[0].ListOfTwo.Count>0);
reader.Close();
}
随着合同的变更
[DataContract(Name = "One", Namespace = "")]
[KnownType(typeof(List<Two>))]
public sealed class One
{
public One()
{
ListOfTwo = new List<Two>();
}
[OnDeserialized]
internal void OnSerializingMethod(StreamingContext context)
{
if (ListOfTwo == null)
{
ListOfTwo = new List<Two>();
}
}
[DataMember]
public List<Two> ListOfTwo { get; set; }
}
[DataContract(Name=“One”,Namespace=”“)]
[知识类型(类型(列表))]
一级公众印章
{
公共一号
{
ListOfTwo=新列表();
}
[已序列化]
内部void OnSerializingMethod(StreamingContext上下文)
{
if(ListOfTwo==null)
{
ListOfTwo=新列表();
}
}
[数据成员]
公共列表ListOfTwo{get;set;}
}
断言很好,ListOfTwo有一个预期的对象。请查看我的更新,我正在运行代码,它可以正常工作。如果不检查xml文件,它是否与您的示例匹配。试着运行我提供的代码。好的,我将勾选V,因为它正在工作,谢谢你。但奇怪的是,XML中的列表必须是第一个,否则它将是空的。为什么呢?如果名单上还有其他成员,测试失败了,你能解释一下吗?谢谢您是否有测试失败的Xml示例?你介意+1这个答案吗?你对这个答案改变主意了吗?不再检查了
[OnDeserialized]
internal void OnSerializingMethod(StreamingContext context)
{
if(ListOfTwo == null) {
ListOfTwo = new List<Two>();
}
}
string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<RootLevel> <!--Container-->
<ListOfOne> <!--List of One -->
<One>
<ListOfTwo> <!--List of Two -->
<Two></Two>
</ListOfTwo>
</One>
</ListOfOne>
</RootLevel>";
var stream = new MemoryStream(Encoding.Default.GetBytes(xml));
using (var reader = XmlDictionaryReader
.CreateTextReader(stream,
new XmlDictionaryReaderQuotas()))
{
DataContractSerializer ser = new DataContractSerializer(typeof(RootLevel));
var deserializedPerson = (RootLevel)ser.ReadObject(reader, true);
Assert.IsTrue(deserializedPerson.ListOfOne[0].ListOfTwo.Count > 0);
reader.Close();
}
[DataContract(Name = "One", Namespace = "")]
[KnownType(typeof(List<Two>))]
public sealed class One
{
public One()
{
ListOfTwo = new List<Two>();
}
[OnDeserialized]
internal void OnSerializingMethod(StreamingContext context)
{
if (ListOfTwo == null)
{
ListOfTwo = new List<Two>();
}
}
[DataMember]
public List<Two> ListOfTwo { get; set; }
}