Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#DataContractSerializer-反序列化列表的列表_C#_Xml_List_Datacontractserializer - Fatal编程技术网

C#DataContractSerializer-反序列化列表的列表

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文件中的列表时遇到问题:

<?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; }
}