2013-06-05 2 views
14

Я пытаюсь десериализации XML-документ:Как Deserialize XML с помощью DataContractSerializer

<?xml version="1.0"?>    
<games xmlns = "http://serialize"> 
    <game> 
     <name>TEST1</name> 
     <code>TESTGAME1</code> 
     <ugn>1111111</ugn> 
     <bets> 
      <bet>5,00</bet> 
     </bets> 
    </game> 
    <game> 
     <name>TEST2</name> 
     <code>TESTGAME2</code> 
     <ugn>222222</ugn> 
     <bets> 
      <bet>0,30</bet> 
      <bet>0,90</bet> 
     </bets> 
    </game> 
</games> 

.cs класс:

namespace XmlParse 
{ 
    using System.Collections.Generic; 
    using System.Runtime.Serialization; 

    [DataContract(Namespace = "http://serialize")] 
    public class game 
    { 
     #region Public Properties 

     [DataMember] 
     public string name { get; set; } 

     [DataMember] 
     public string code { get; set; } 

     [DataMember] 
     public long ugn { get; set; } 

     [DataMember] 
     public List<decimal> bets { get; set; } 

     #endregion 
    } 

    [KnownType(typeof(game))] 
    [DataContract(Namespace = "http://serialize")] 
    public class games 
    { 
     #region Public Properties 

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

     #endregion 
    } 
} 

Главная:

FileStream fs = new FileStream(Path.Combine(this.path, xmlDocumentName), FileMode.Open); 

XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 
DataContractSerializer ser = new DataContractSerializer(typeof(games)); 

// Deserialize the data and read it from the instance. 
games deserializedPerson = (games)ser.ReadObject(reader, true); 
reader.Close(); 
fs.Close(); 

deserializedPerson показывает количество = 0

wh у дает?

enter image description here

+1

Возможный дубликат HTTP://stackoverflow.com/questions/15413468/deserializing-xml-with-datacontractserializer?rq=1 –

ответ

19

Я понял это. Возможно, есть и другие реализации, но это работает. Для жизни я не мог найти примеров, которые используют List внутри объекта. Вот рабочий пример:

XML документ для разбора:

<?xml version="1.0"?>    
<games xmlns = "http://serialize"> 
    <game> 
     <name>TEST1</name> 
     <code>TESTGAME1</code> 
     <ugn>1111111</ugn> 
     <bets> 
      <bet>5,00</bet> 
     </bets> 
    </game> 
    <game> 
     <name>TEST2</name> 
     <code>TESTGAME2</code> 
     <ugn>222222</ugn> 
     <bets> 
      <bet>0,30</bet> 
      <bet>0,90</bet> 
     </bets> 
    </game> 
</games> 

.cs класс:

namespace XmlParse 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Globalization; 
    using System.Runtime.Serialization; 

    [DataContract(Name = "game", Namespace = "")] 
    public class Game 
    { 
     [DataMember(Name = "name", Order = 0)] 
     public string Name { get; private set; } 

     [DataMember(Name = "code", Order = 1)] 
     public string Code { get; private set; } 

     [DataMember(Name = "ugn", Order = 2)] 
     public string Ugn { get; private set; } 

     [DataMember(Name = "bets", Order = 3)] 
     public Bets Bets { get; private set; } 
    } 

    [CollectionDataContract(Name = "bets", ItemName = "bet", Namespace = "")] 
    public class Bets : List<string> 
    { 
     public List<decimal> BetList 
     { 
      get 
      { 
       return ConvertAll(y => decimal.Parse(y, NumberStyles.Currency)); 
      } 
     } 
    } 

    [CollectionDataContract(Name = "games", Namespace = "")] 
    public class Games : List<Game> 
    { 
    } 
} 

чтения и разбора XML-документ:

string fileName = Path.Combine(this.path, "Document.xml"); 
DataContractSerializer dcs = new DataContractSerializer(typeof(Games)); 
FileStream fs = new FileStream(fileName, FileMode.Open); 
XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 

Games games = (Games)dcs.ReadObject(reader); 
reader.Close(); 
fs.Close(); 
+2

Вам нужен атрибут order beca используйте поведение по умолчанию в алфавитном порядке. –

Смежные вопросы