2016-12-13 16 views
0

私はxamarinフォームプロジェクトでplayerというオブジェクトをシリアル化および逆シリアル化しようとしています。 とプレイヤーがどのように見えるのthats:私はオブジェクトをシリアライズし、デシリアライズするには、Androidプロジェクトでこれらのメソッドを使用xamarinフォームからオブジェクトを逆シリアル化できません

public class Player 
    { 

     //stores weather the player ended his turn 
     public bool turnOver = false; 
     //the name of the player 

     public string name { get; set; } 
     //total score of the player 

     public long score { get; set; } 
     //coins to buy abillities 

     public int coins { get; set; } 
     //array that stores for each ability how much uses left 

     public int[] abilities = { 2, 2, 2, 2 }; 
     //the levels the player have completed 

     public List<long> completedLevels; 
     //player constructor that initializes all the data for initial use 
     public Player() 
     { 
      this.name = ""; 
      score = 0; 
      coins = 100; 
      completedLevels = new List<long>(); 
     } 
     } 

。私は例外を取得デシリアライズしようとしたとき

public void Serialize<T>(Player list) 
    { 
      //Creating XmlSerializer. 
      XmlSerializer serializer = new XmlSerializer(typeof(T)); 
      var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
      var filePath = Path.Combine(documentsPath, "data1.xml"); 
      var file = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write); 
      var strm = new StreamWriter(file); 
      //Convert the XML to List 
      serializer.Serialize(strm, list); 
      strm.Close(); 
    } 

    public T GenericDeSerialize<T>() 
    { 
     //Creating XmlSerializer for the object 
     XmlSerializer serializer = new XmlSerializer(typeof(T)); 
     var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); 
     var filePath = Path.Combine(documentsPath, "data1.xml"); 
     var file = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Read); 
     var strm = new StreamReader(file); 
     string text = strm.ReadToEnd(); 
     //Deserialize back to object from XML 
     T b = (T)serializer.Deserialize(strm); 
     strm.Close(); 
     return b; 

    } 

今シリアル化部分はうまく行くが:

Root element is missing

私は、生成されたXMLを見ていたし、それがそのようになっています

<?xml version="1.0" encoding="utf-8"?> 
<Player xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <turnOver>false</turnOver> 
    <abilities> 
    <int>2</int> 
    <int>2</int> 
    <int>2</int> 
    <int>2</int> 
    </abilities> 
    <completedLevels /> 
    <name /> 
    <score>0</score> 
    <coins>500</coins> 
</Player> 

私はこの問題を見つけることができません誰もxmlserializerが何かを書いている可能性があり、それを読むことができなかった理由を指摘できますか? ありがとう

編集: シリアライザは、2つの機能を持つクラスです。シリアル化中に

 Serializer ser = new Serializer(); 
     Player p = new Player(); 
     p.coins = 500; 
     ser.Serialize<Player>(p); 
     ser.GenericDeSerialize<Player>(); 

答えて

1

、コードは次のことを行います。

XmlSerializer serializer = new XmlSerializer(typeof(T)); 

しかし、直列化復元の際に、これを行います。

XmlSerializer serializer = new XmlSerializer(typeof(List<T>)); 

リスト<プレーヤー>をデシリアライズしようとしているが、あなたはシリアル化されましたPlayer、およびあなたのXMLはリスト< Player>ではなく、1つのPlayerを表示します。同じ種類のシリアル化と逆シリアル化が必要です。

EDIT

第二の問題は、直列化復元中にある、コードは二回ストリームを消費しようとしている:

string text = strm.ReadToEnd(); 
    //Deserialize back to object from XML 
    T b = (T)serializer.Deserialize(strm); 

strm.ReadToEnd()呼び出しがために何も残さない、ストリームを消費します使用するserializer.Deserialize呼び出し。 strm.ReadToEnd()コール(コードは 'text'を使用していません)を取り除くか、 'text'から逆シリアル化するか、ストリームをコール間の先頭にリセットします。

+0

私はちょうど今この愚かな間違いに気づいたが、私はそれを修正後同じエラーが発生します:/ –

+0

私はこの感謝を修正するために投稿を編集:) –

+0

テンプレートパラメータを表示するこれらの汎用関数を呼び出すコードを含めてください。 – DavidS

関連する問題