2017-11-09 16 views
0

いくつかのXMLをオブジェクトのリストに逆直列化しようとしています。xmlをオブジェクトのリストにデシリアライズ

問題が発生しているのは、Eventオブジェクト内の2次オブジェクトResourcesに値が設定されていないということです。もう少しバックグラウンドでは、これは単一プロジェクトです。私は起こり得るランダムなイベントのリストを逆シリアル化しています。以下は

私がテストしていたXMLです:

ここ
<?xml version='1.0'?> 
<Events> 
    <Event> 
    <Description> 
     this is a test 
    </Description> 
    <Reward> 
     <Food> 
      0 
     </Food> 
     <Energy> 
      1 
     </Energy> 
     <Happiness> 
      2 
     </Happiness> 
     <ShipHp> 
      3 
     </ShipHp> 
     <Garbage> 
      4 
     </Garbage> 
    </Reward> 
    <Cost> 
     <Food> 
      0 
     </Food> 
     <Energy> 
      1 
     </Energy> 
     <Happiness> 
      2 
     </Happiness> 
     <ShipHp> 
      3 
     </ShipHp> 
     <Garbage> 
      4 
     </Garbage> 
    </Cost> 
    <EventType> 
     Good 
    </EventType> 
    <EventId> 
     1 
    </EventId> 
    </Event> 
    <Event> 
    <Description> 
     this is a test 
    </Description> 
    <Reward> 
     <Food> 
      0 
     </Food> 
     <Energy> 
      1 
     </Energy> 
     <Happiness> 
      2 
     </Happiness> 
     <ShipHp> 
      3 
     </ShipHp> 
     <Garbage> 
      4 
     </Garbage> 
    </Reward> 
    <Cost> 
     <Food> 
      0 
     </Food> 
     <Energy> 
      1 
     </Energy> 
     <Happiness> 
      2 
     </Happiness> 
     <ShipHp> 
      3 
     </ShipHp> 
     <Garbage> 
      4 
     </Garbage> 
    </Cost> 
    <EventType> 
     Good 
    </EventType> 
    <EventId> 
     1 
    </EventId> 
    </Event> 
</Events> 

は、オブジェクト(イベント・資源)、次のとおりです。

public class EventHandler : MonoBehaviour 
{ 

    [XmlInclude(typeof(Event))] 
    [XmlInclude(typeof(Resources))] 
    [Serializable, XmlRoot("Events")] 
    public class EventData 
    { 
     [XmlElement("Event")] 
     public List<Event> Events { get; set; } 

     public EventData() 
     { 
      List<Event> Events = new List<Event>(); 
     } 
    } 

    List<Event> Events = new List<Event>(); 
    public static EventHandler instance; 

    // Use this for initialization, called on script enabling 
    void Start() 
    { 

     var serializer = new XmlSerializer(typeof(EventData)); 
     try 
     { 
      string xml = File.ReadAllText("Assets/TextResources/Events.xml"); 
      xml = xml.Replace("\n", string.Empty); 
      xml = xml.Replace("\r", string.Empty); 
      xml = xml.Replace("\t", string.Empty); 
      using (var stringReader = new StringReader(xml)) 
      { 
       using (var reader = XmlReader.Create(stringReader)) 
       { 
        var result = (EventData)serializer.Deserialize(reader); 
        Events = result.Events; 

       } 
      } 
     } 
     catch(Exception ex) 
     { 
      Debug.Log(ex); 
     } 
    } 
} 

public class Event { 
    [XmlElement("Description")] 
    public string Description { get; set; } 

    [XmlElement("Reward")] 
    public Resources Reward { get; set; } 

    [XmlElement("Cost")] 
    public Resources Cost { get; set; } 

    [XmlElement("EventId")] 
    public int EventId { get; set; } 

    [XmlElement("EventType")] 
    public string EventType { get; set; } 

} 

[XmlType("Resources")] 
public class Resources { 

    //Each prop can be extended to food being a Food object with expiry, etc 
    [XmlElement("Food")] 
    public int Food { get; set; } // 0 to cap 
    [XmlElement("Happiness")] 
    public int Happiness { get; set; } // 0 to 100 
    [XmlElement("Energy")] 
    public int Energy { get; set; } //0 to cap 
    [XmlElement("ShipHp")] 
    public int ShipHp { get; set; }// cap to 0 
    [XmlElement("Garbage")] 
    public int Garbage { get; set; } // 0 to cap 
} 

そして、ここでは、私が持っているdeserialzationコードです

このコードから、私のイベントオブジェクトには、Description、の値が設定されていますとEventIdですが、RewardCostリソースオブジェクトには値が設定されていません。これまでのところ、私は紛失しています。ボーナスポイントについては、文字列を解析することで得られるデッドスペースをすべて削除する方法を見つけるのにも苦労しています。 (つまり、Goodは "\ n \ r Good"に変更されます)。

答えて

1

OK。だから私は問題の解決策を見つけました。私はこれに熟練していません。訂正があれば、経験豊富な人がコードを改善するために追加したいと思っています。

<ArrayOfEvent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Event> 
    <Description>abc</Description> 
    <Reward> 
     <Food>0</Food> 
     <Happiness>2</Happiness> 
     <Energy>1</Energy> 
     <ShipHp>3</ShipHp> 
     <Garbage>4</Garbage> 
    </Reward> 
    <Cost> 
     <Food>0</Food> 
     <Happiness>2</Happiness> 
     <Energy>1</Energy> 
     <ShipHp>3</ShipHp> 
     <Garbage>4</Garbage> 
    </Cost> 
    <EventId>1</EventId> 
    <EventType>Good</EventType> 
    </Event> 
    <Event> 
    <Description>def</Description> 
    <Reward> 
     <Food>0</Food> 
     <Happiness>2</Happiness> 
     <Energy>1</Energy> 
     <ShipHp>3</ShipHp> 
     <Garbage>4</Garbage> 
    </Reward> 
    <Cost> 
     <Food>0</Food> 
     <Happiness>2</Happiness> 
     <Energy>1</Energy> 
     <ShipHp>3</ShipHp> 
     <Garbage>4</Garbage> 
    </Cost> 
    <EventId>2</EventId> 
    <EventType>Good</EventType> 
    </Event> 
</ArrayOfEvent> 
:すべての

まず、私のXMLで整形問題があった、これを見つける私が実際にイベントオブジェクトのリストをシリアライズし、それに対する解決策を見つけるために、結果のテキストを使用するには、以下に改訂されたテキストです。

最初に気づくのは、私がイベントオブジェクトのリストを作成したことです。これは<ArrayOfEvent>タグと生成されたxml名前空間の属性です。それから。これはまた、私がEventDataクラスからちょうどList<Event>に変更しなければならないことを意味しました。 EventResourcesクラスのように、クラスに[Serializable, XmlRoot()]タグを追加しました。 もう1つ注意すべき点は、文字列から列挙型にスワップしたことです。 これらの修正により、xmlプレーンテキストからXmlReaderへの書式設定の問題も修正されました それはそれは大きなでは問題ではありませんでした問題であったが、

[Serializable, XmlRoot("Event")] 
public class Event 
{ 
    [XmlElement("Description")] 
    public string Description { get; set; } 

    [XmlElement("Reward")] 
    public Resources Reward { get; set; } 

    [XmlElement("Cost")] 
    public Resources Cost { get; set; } 

    [XmlElement("EventId")] 
    public int EventId { get; set; } 

    [XmlElement("EventType")] 
    public EventType EventType { get; set; } 
    [XmlIgnore] 
    public string MarkUp { get; set; } 
} 


[Serializable, XmlRoot("Resources")] 
public class Resources 
{ 
    //Each prop can be extended to food being a Food object with expiry, etc 
    [XmlElement("Food")] 
    public int Food { get; set; } // 0 to cap 
    [XmlElement("Happiness")] 
    public int Happiness { get; set; } // 0 to 100 
    [XmlElement("Energy")] 
    public int Energy { get; set; } //0 to cap 
    [XmlElement("ShipHp")] 
    public int ShipHp { get; set; }// cap to 0 
    [XmlElement("Garbage")] 
    public int Garbage { get; set; } // 0 to cap 
} 

[XmlType("EventType")] 
public enum EventType 
{ 
    [XmlEnum("Good")] 
    Good = 0, 
    [XmlEnum("Bad")] 
    Bad, 
    [XmlEnum("Neutral")] 
    Neutral 
} 


public class EventHandler : MonoBehaviour 
{ 

    List<Event> Events = new List<Event>(); 

    // Use this for initialization, called on script enabling 
    void Start() 
    { 
     try 
     { 
      var serializer = new XmlSerializer(typeof(List<Event>)); 

      string xml = File.ReadAllText("Assets/TextResources/Events.xml"); 
      xml = XDocument.Parse(xml).ToString(SaveOptions.DisableFormatting); 

      using (var stringReader = new StringReader(xml)) 
      { 
       using (var reader = XmlReader.Create(stringReader)) 
       { 
        var result = (List<Event>)serializer.Deserialize(reader); 
        Events = result; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.Log(ex); 
     } 
    } 
} 

基本シリアライザ方法フィードバック用

private void serializeList() 
{ 
    XmlSerializer ser = new XmlSerializer(typeof(List<Event>)); 
    List<Event> list = new List<Event>(); 
    list.Add(new Event { EventId = 1, Description = "abc", EventType = EventType.Good, Cost = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 }, Reward = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 } }); 
    list.Add(new Event { EventId = 2, Description = "def", EventType = EventType.Good, Cost = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 }, Reward = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 } }); 
    list.Add(new Event { EventId = 3, Description = "ghi", EventType = EventType.Good, Cost = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 }, Reward = new Resources { Food = 0, Energy = 1, Happiness = 2, ShipHp = 3, Garbage = 4 } }); 
    StreamWriter sw = new StreamWriter("Assets/TextResources/test.xml"); 
    ser.Serialize(sw, list); 
    sw.Close(); 
} 
0

あなたのXMLは無効です。最初のResourcesタグは閉じられません。

+0

ありがとう:将来の読者のために、以下の完全なコードを共有します –

関連する問題