2017-10-12 1 views
0

Attentes: lecture de la liste des ints du fichier XML dans la liste appelée itemPool;Tentative de désérialisation de la liste des ints à l'aide de DataContractSerializer, réception inattendue InvalidOperationException

Résultat: "InvalidOperationException: Impossible d'ajouter le type System.Collections.Generic.List`1 [System.Int32] à la collecte de type connu Il existe déjà un type enregistré pour le nom XML http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfint."

Je dois code suivant:

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()); 
    } 
} 

Et une autre classe avec la méthode suivante:

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(); 
    } 

Et le fichier xml-abo suivant que la classe Je lis à partir de.

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

Répondre

0

Édité à l'aide de 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(); 
     } 
    } 
} 

fichier 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

J'utilise DataContractSerializer je peux sérialisation champs privés - en utilisant des champs publics pour tout ce qui doit être publié en feuilleton est pas vraiment possible. Je pourrais avoir été vague dans mon op, la classe d'article n'a pas un champ appelé «valeur», c'est juste la définition XML d'un tableau d'ints, autant que je sache. int [] ints {1} = ag4w

+0

j'ai modifié le fichier à utiliser DataContractSerializer – Programmer

+0

Je pense que vous avez mal compris ma question/question, je ne suis pas désérialisation une liste d'articles - I Essaie de désérialiser une liste d'ints. Et pour une raison quelconque, je reçois le InvalidOperationException. – ag4w