2014-12-23 44 views
-1

我正在使用一個XML序列化程序,我試圖序列化一個類。 xml爲以下類提供了一個空節點。當我將鍵和值列表設置爲公共時,則統一會凍結。難以得到一個類序列化

using System; 
using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
namespace Grimoire.Tools.CerealTools 
{ 
    [Serializable] 
    public class CerealDictionary<Key, Value> //: IEnumerable 
     { 
     [SerializeField] 
     private List<Key> keys = new List<Key>(); 
     [SerializeField] 
     private List<Value> values = new List<Value>(); 
     public CerealDictionary(){} 
     public Value this[Key k] 
      { 
      get 
       { 
       int count = keys.IndexOf(k); 
       return values[count]; 
       }//getters and setters for indexers :) 
      set 
       { 
       int count = keys.IndexOf(k); 
       if (count>-1){values[count]=value;} 
       else//if the index doesnt exist, then we should make a new one :) 
        { 
        values.Add(value); 
        keys.Add(k); 
        } 
       } 
      } 
     public void Add(Key key, Value value) 
      { 
      //if (keys.Contains(key)){return;} 
      keys.Add(key); 
      values.Add(value); 
      } 
     public void Remove(Key key) 
      { 
      if (!keys.Contains(key)){return;} 
      int index = keys.IndexOf(key); 
      keys.RemoveAt(index); 
      values.RemoveAt(index); 
      } 
     public bool TryGetValue(Key key, out Value value) 
      { 
      if (keys.Count != values.Count) 
       { 
       keys.Clear(); 
       values.Clear(); 
       value = default(Value); 
       return false; 
       } 
      if (!keys.Contains(key)) 
       { 
       value = default(Value); 
       return false; 
       } 
      int index = keys.IndexOf(key); 
      value = values[index]; 
      return true; 
      } 
     public bool TryGetKey(Value value, out Key key) 
      { 
      if (keys.Count != values.Count) 
       { 
       values.Clear(); 
       keys.Clear(); 
       key = default(Key); 
       return false; 
       } 
      if (!values.Contains(value)) 
       { 
       key = default(Key); 
       return false; 
       } 
      int index = values.IndexOf(value); 
      key = keys[index]; 
      return true; 
      } 
     public bool getGroup(Key key, out List<Value> thisValues) 
      { 
      thisValues = new List<Value>(); 
      if (keys.IndexOf(key)==-1){return false;} 
      foreach(Key keyTemp in keys) 
       { 
       int index = keys.IndexOf(keyTemp); 
       thisValues.Add(values[index]); 
       } 
      return true; 
      } 
     public void ChangeValue(Key key, Value value) 
      { 
      if (!keys.Contains(key)){return;} 
      int index = keys.IndexOf(key); 
      values[index] = value; 
      } 
     public int length() 
      { 
      return keys.Count; 
      } 
//  IEnumerator IEnumerable.GetEnumerator() 
//   { 
//   return getEnumerator(keys,values); 
//   } 
//  private Grimoire.Tools.CerealTools.CerealDictionaryEnumerator<Value> getEnumerator() 
//   { 
//   return new CerealDictionaryEnumerator<Value>(values); 
//   } 
    } 
} 

這是序列化我的類的代碼。

using UnityEngine; 
using System.Collections; 
using System.Xml.Serialization; 
using System.IO; 
public class StringSerializer {//for object to string serialization 
    public static string convertToString<t>(t workObject) 
     {//changes object to string 
     XmlSerializer xmlSerializer = new XmlSerializer(workObject.GetType()); 
     StringWriter stringWriter = new StringWriter(); 
     xmlSerializer.Serialize(stringWriter,workObject); 
     return stringWriter.ToString(); 
     } 
    public static t convertFromString<t>(System.Type buildType,string buildString) 
     { 
     TextReader stringReader = new StringReader(buildString); 
     XmlSerializer xmlSerlializer = new XmlSerializer(buildType); 
     return (t)xmlSerlializer.Deserialize(stringReader); 
     } 
} 

這是正在被序列化的類。它使用的是一個空白節點的類。

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using System; 
[Serializable] 
public class ExampleBoard : IBoardData { 
    public override List<Piece> pieces { get;set;}//position number, game piece 
    public override Grimoire.Tools.CerealTools.CerealDictionary<int,BookInformation> books {get;set;}//number of books, book number 
    public override Grimoire.Tools.CerealTools.CerealDictionary<int,int> rooms {get;set;}//position, room number. It details the relationship between positions and rooms 
    public override Grimoire.Tools.Vector2 boardDimensions{get;set;} 
    public override Grimoire.Tools.Vector2 boardSize{get;set;} 
    public override int bookTotal{get;set;} 
    public override int roomSize{get;set;} 
    public ExampleBoard(){}//serialization....sigh 
    public override void set() 
     { 
     boardDimensions = new Grimoire.Tools.Vector2(2,2); 
     boardSize = new Grimoire.Tools.Vector2(968,968); 
     roomSize = 484; 
     books = new Grimoire.Tools.CerealTools.CerealDictionary<int,BookInformation>(); 
     populateBooks(); 
     bookTotal = books.length(); 
     pieces = new List<Piece>(); 
     populatePieces(); 
     rooms = new Grimoire.Tools.CerealTools.CerealDictionary<int, int>(); 
     populateRoom (boardSize); 
     } 
    public override void saveSize(Grimoire.Tools.Vector2 size) 
     { 
     populateRoom (size); 
     boardSize = getBoardSize(size); 
     boardDimensions = size; 
     } 
    private Grimoire.Tools.Vector2 getBoardSize(Grimoire.Tools.Vector2 size) 
     { 
     return new Grimoire.Tools.Vector2((float)(size.x*roomSize),(float)((size.y*roomSize))); 
     } 
    public override void save(){}// needs to be here. 
    private void populateRoom(Grimoire.Tools.Vector2 size)//position number, room number 
     { 
     int count = (int)(size.x*size.y); 
     double roomCount = 0; 
     int positionCount = -1; 
     for(int i=0;i<count;i++) 
      { 
      roomCount += 0.25; 
      positionCount +=1; 
      rooms.Add((int)roomCount,positionCount); 
      } 
     } 
    private void populateBooks()// number of books, book name. 
     { 
     books.Add (1,new BookInformation(9,0,1)); 
     books.Add (2,new BookInformation(9,1,2)); 
     books.Add (3,new BookInformation(9,2,3)); 
     books.Add (4,new BookInformation(9,3,4)); 
     books.Add (5,new BookInformation(9,4,5)); 
     books.Add (6,new BookInformation(9,5,6)); 
     books.Add (7,new BookInformation(9,6,7)); 
     books.Add (8,new BookInformation(9,7,8)); 
     books.Add (9,new BookInformation(9,8,9)); 
     } 
    public override int getBookPosition(int bookNumber) 
     { 
     for(int i=1;i<books.length()+1;i++) 
      { 
      if (books[i].type==bookNumber){return books[i].key;} 
      } 
     return 0; 
     } 
    private void populatePieces()// piece position, piece. Change the pieces to something else later 
     { 
     pieces.Add (new Piece(1,"start",-1f));//start 
     pieces.Add (new Piece(1,"apprentice",-1.1f));//player 
     //_pieces.Add (new Piece(2,"apprentice",-1.1f)); 
     pieces.Add (new Piece(7,"right wall",-1f));//a box maybe 
     pieces.Add (new Piece(8,"exit",-1f));//exit 
     pieces.Add (new Piece(13,"gargoyle",-1.1f)); 
     } 
    public override int getRoomFromPosition(int position) 
     { 
     int room; 
     rooms.TryGetKey(position-1,out room); 
     return room; 
     } 
} 

這裏是xml輸出。書籍和房間集合即將空白。

<?xml version="1.0" encoding="utf-16"?> 
<Level xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <position> 
    <x>0</x> 
    <y>0</y> 
    <z>0</z> 
    </position> 
    <name>0</name> 
    <unlocked>true</unlocked> 
    <starTotal>0</starTotal> 
    <difficulty>0</difficulty> 
    <size> 
    <x>0</x> 
    <y>0</y> 
    </size> 
    <board xsi:type="ExampleBoard"> 
    <pieces> 
     <Piece> 
     <position>1</position> 
     <name>start</name> 
     <z>-1</z> 
     </Piece> 
     <Piece> 
     <position>1</position> 
     <name>apprentice</name> 
     <z>-1.1</z> 
     </Piece> 
     <Piece> 
     <position>7</position> 
     <name>right wall</name> 
     <z>-1</z> 
     </Piece> 
     <Piece> 
     <position>8</position> 
     <name>exit</name> 
     <z>-1</z> 
     </Piece> 
     <Piece> 
     <position>13</position> 
     <name>gargoyle</name> 
     <z>-1.1</z> 
     </Piece> 
    </pieces> 
    <books /> 
    <rooms /> 
    <boardDimensions> 
     <x>2</x> 
     <y>2</y> 
    </boardDimensions> 
    <boardSize> 
     <x>968</x> 
     <y>968</y> 
    </boardSize> 
    <bookTotal>9</bookTotal> 
    <roomSize>484</roomSize> 
    </board> 
</Level> 

這裏是IBoardData,正被序列化導出從這個類。

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using System.Xml.Serialization; 
[XmlInclude(typeof(ExampleBoard)),XmlInclude(typeof(LevelBoard))] 
public abstract class IBoardData 
    {//this was an interface, but those cant be serialized easily 
    [XmlIgnore]public virtual List<Piece> pieces { get{throw new UnityException("Class doesn't inherit pieces");}set{}}//position number, game piece 
    [XmlIgnore]public virtual Grimoire.Tools.CerealTools.CerealDictionary<int,BookInformation> books { get{throw new UnityException("Class doesn't inherit books");}set{}}//number of books, book name 
    [XmlIgnore]public virtual Grimoire.Tools.CerealTools.CerealDictionary<int,int> rooms{ get{throw new UnityException("Class doesn't inherit rooms");}set{}} 
    public virtual void save(){throw new UnityException("Class doesn't inherit save");} 
    [XmlIgnore]public virtual Grimoire.Tools.Vector2 boardDimensions{get{throw new UnityException("Class doesn't inherit boardDimensions");}set{}} 
    [XmlIgnore]public virtual Grimoire.Tools.Vector2 boardSize{get{throw new UnityException("Class doesn't inherit boardSize");}set{}} 
    [XmlIgnore]public virtual int bookTotal{get{throw new UnityException("Class doesn't inherit bookTotal");}set{}} 
    public virtual int getRoomFromPosition(int pos){throw new UnityException("Class doesn't inherit getRoomPosition");} 
    [XmlIgnore]public virtual int roomSize{get{throw new UnityException("Class doesn't inherit roomSize");}set{}} 
    public virtual int getBookPosition(int bookNumber){throw new UnityException("Class doesn't inherit getBookPosition");} 
    public virtual void saveSize(Grimoire.Tools.Vector2 size){throw new UnityException("Class doesn't inherit saveSize");} 
    public virtual void set(){throw new UnityException("Class doesn't inherit set");} 
    } 
+2

也許你應該顯示你用來序列化的代碼?既然那是凍結的代碼? –

+0

編輯,添加任何可能有用的東西。 – user42537

+0

可能不是問題,但我相信'XmlSerializer'不需要(實際上忽略)'Serializable'屬性 – vesan

回答

0

我昨天通過關閉和打開電腦解決了問題。我不知道問題是什麼,但它可能是團結編造錯誤或某種性質的問題。