2013-09-12 4 views
0

У меня есть проблема десериализации список список в моем файле XML:C# DataContractSerializer - Deserialize список список

<?xml version="1.0" encoding="UTF-8"?> 
<RootLevel><!--Container--> 
    <ListOfOne><!--List of One --> 
     <One> 
     <ListOfTwo> <!--List of Two --> 
      <Two></Two> 
     </ListOfTwo> 
     </One> 
    </ListOfOne> 
</RootLevel> 

RootLevel имеет Список One. Один имеет список из двух

Первый уровень (ListOfOne) работает файл с любой проблемой, проблема заключается в том, что ListOfTwo не будучи десериализован

[KnownType(typeof(List<One>))] 
    [DataContract(Name = "RootLevel", Namespace = "")] 
    public sealed class RootLevel 
    { 
     [DataMember()] 
     public List<One> ListOfOne { get; set; } 

     public RootLevel() 
     { 
      ListOfOne = new List<One>(); 
     } 
    } 

[DataContract(Name = "One", Namespace = "")] 
    [KnownType(typeof(List<Two>))] 
    public sealed class One 
    { 
     public One() 
     { 
      ListOfTwo = new List<Two>(); 
     } 
     [OnDeserialized] 
     internal void OnSerializingMethod(StreamingContext context) 
     { 
      ListOfTwo = new List<Two>(); 
     } 

     [DataMember] 
     public List<Two> ListOfTwo { get; set; } 
} 

[DataContract(Name = "Two", Namespace = "")] 
    public sealed class Two 
    {} 

Это операция:

using (var fs = new FileStream("path to file", FileMode.Open)) 
      { 

       using (var reader = XmlDictionaryReader.CreateTextReader(fs, 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(); 
        fs.Close(); 
       } 
      } 

ответ

1

Если вы уронили эту часть кода все работает, как ожидалось:

[OnDeserialized] 
internal void OnSerializingMethod(StreamingContext context) 
    ListOfTwo = new List<Two>(); 
} 

Если вы хотите, чтобы убедиться, что у вас всегда есть пустое ListOfTwo изменить его на:

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

И подтверждение хорошо, ListOfTwo имеет один объект, как ожидалось.

+0

Спасибо, но я уже был там. не работает. –

+0

Пожалуйста, смотрите мое обновление, я запускаю код, и он работает. Если вы не проверите свой XML-файл, это соответствует вашему примеру. Попробуйте запустить код, который я предоставил. –

+0

Хорошо, я буду указывать V, потому что он работает, и спасибо за это. Но странно, что List в XML должен быть первым, иначе он будет null. почему это? если у меня есть другие члены выше списка, тест не проходит, можете ли вы объяснить? благодаря! –