2017-10-12 4 views
0

期待:XMLファイルのintのリストをitemPoolというリストに読み込みます。DataContractSerializerを使用してintリストを逆シリアル化しようとしましたが、予期しないInvalidOperationExceptionが発生しました

結果:「InvalidOperationExceptionが:。System.Collections.Generic.List`1は[可能System.Int32]知られているタイプのコレクションにすでにXML名http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfintの登録タイプがあるタイプの追加に失敗しました」私が持っている

次のコード:

using System.Collections.Generic; 
using System.Runtime.Serialization; 

using Characters; 
using Items; 

[DataContract(Name ="Savefile", Namespace ="")] 
public class Savefile 
{ 
    [DataMember(Name ="Characters")] 
    public List<Character> characters = new List<Character>(); 

    [DataMember(Name = "ItemPool")] 
    public List<int> itemPool = new List<int>(); 

    public void Initialize() 
    { 
     foreach (Character c in characters) 
      c.Initialize(); 

     ItemPool.Load(itemPool.ToArray()); 
    } 
} 

そして、次のような方法で別のクラス:

public static void LoadFromSavefile() 
    { 
     DataContractSerializer serializer = new DataContractSerializer(typeof(Savefile)); 
     FileStream stream = new FileStream(Path.Combine(Application.dataPath, _savefilePath), FileMode.Open); 

     _currentSave = serializer.ReadObject(stream) as Savefile; 

     stream.Close(); 
    } 

そして、次のXMLファイル、そのクラスのABO読んでから。

<?xml version="1.0" encoding="utf-8"?> 
<Savefile xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Characters> 
    <Character> 
     <... not relevant clutter.../> 
    </Character> 
    </Characters> 
    <ItemPool> 
    <value>1</value> 
    </ItemPool> 
</Savefile> 

答えて

0

DataContractSerializerを使用して編集しました。私は、DataContractSerializerを使用してい

using System; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Runtime.Serialization; 
using System.Collections.Generic; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace UnitTestProject1 { 

    [DataContract(Name = "Savefile", Namespace = "")] 
    public class Savefile { 
     [DataMember(Name = "Characters", Order = 0)] 
     public Characters Characters { get; private set; } 

     [DataMember(Name = "ItemPool", Order = 1)] 
     public Items ItemPool { get; private set; } 

    } 

    [CollectionDataContract(Name = "Characters", ItemName = "Character", Namespace = "")] 
    public class Characters : List<Character> { 

    } 

    public class Character { 
     public string Weapon { get; set; } 
     internal void Initialize() { 
      throw new NotImplementedException(); 
     } 
    } 

    [CollectionDataContract(Name = "ItemPool", ItemName = "Item", Namespace = "")] 
    public class Items : List<int> { 
     public int value { get; set; } 
    } 

    [TestClass] 
    public class UnitTestSerialization { 
     [TestMethod] 
     public void TestMethod1() { 
      DataContractSerializer serializer = new DataContractSerializer(typeof(Savefile)); 
      FileStream stream = new FileStream("SaveFile2.xml", FileMode.Open); 
      XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()); 

      Savefile _currentSave = (Savefile)serializer.ReadObject(reader); 
      Assert.IsNotNull(_currentSave); 


      stream.Close(); 
     } 
    } 
} 

xmlファイル

<?xml version="1.0" encoding="utf-8"?> 
<Savefile> 
    <Characters> 
    <Character> 
     <Weapon>Axe</Weapon> 
    </Character> 
    <Character> 
     <Weapon>Mace</Weapon> 
    </Character> 
    <Character> 

    </Character> 
    </Characters> 
    <ItemPool> 
    <Item>1</Item> 
    <Item>2</Item> 
    </ItemPool> 
</Savefile> 
+0

ので、私は、プライベートフィールドをシリアル化することができます - シリアル化する必要が本当に現実的ではありませんすべてのためのパブリックフィールドを使用して。 私は、私の知っている限り、私の漠然としているかもしれませんが、Itemクラスには "value"というフィールドがありません。これはintの配列のXML定義です。 私はあなたが私の問題/質問を誤解していると思う私は、DataContractSerializer – ag4w

+0

は、私が項目のリストをデシリアライズではないのです - I intのリストをデシリアライズしようとしています。 何らかの理由で、私はInvalidOperationExceptionを受け取ります。 – Programmer

+0

を使用するために、ファイルを編集しているのint [] int型{1} = ag4w

関連する問題