2014-04-10 27 views
3

我正在尝试读取/写入一个xml文件来为我的游戏存储一些数据。这里是我试图存储对象:Unity中的XML序列化iOS例外

public struct EndRaceData 
{ 
     // Data used to display section by section data 
     public List<SpeedRecord> speedRecords { get; set; } 
     // Data used for making a map 
     public List<KeyValuePair<String,SpeedRecord>>recordsByname { get; set; } 
     // Taken from Datatracker.instance 
     public List<KeyValuePair<String,List<DataRecorder.GPSPoint>>> pointsPerChallenge { get; set; } 
     // Taken from DataRecorder.instance 
     public List<SpeedSegment> averageSpeeds { get; set; } 
     // Taken from IPlayer.. 
     public float caloriesburnt { get; set; } 
     // Taken from Datatracker.instance 
     public float topSpeed { get; set; } 
     // taken from Datatracker.instance 
     public float points { get; set; } 
     // taken from Datatracker.instance 
     public string difficulty { get; set; } 
     // taken from Datatracker.instance 
     public float completedPercentage { get; set; } 
     // challenge-specific data 
     public int passedChallenges { get; set; } 
     // Datatracker.instance 
     public int failedChallenges { get; set; } 
     // Datatracker.instance 
     public int fastChallengesPassed { get; set; } 
     // Datatracker.instance 
     public int slowChallengesPassed { get; set; } 
     // Datatracker.instance 
     public int keepChallengesPassed{ get; set; } 
     // Datatracker.instance 
     public string startTime { get; set; } 
     // Datatracker.instance 
     public string endTime { get; set; } 


     public float distanceTravelled { get; set; } 

    public string filePath {get; set;} 
} 

其中SpeedRecord是:

public struct SpeedRecord 
{ 
     public float speed; 
     public float distance; 
     public string name; 
     public string sectionStartTime, sectionEndTime; 

     public SpeedRecord (string name, float speed, float distance, DateTime startTime, DateTime endTime) 
     { 
       this.speed = speed; 
       this.name = name; 
       this.distance = distance; 
       this.sectionStartTime = startTime.ToString(); 
       this.sectionEndTime = endTime.ToString(); 
     } 

     public override string ToString() 
     { 
       return string.Format ("{0}\r\nAVG speed : {1} km/h\r\nDist : {2} m\r\nTime : {3} -> {4}\r\n", this.name, this.speed, this.distance, this.sectionStartTime, this.sectionEndTime);   
     } 
} 

SpeedSegment是:

public struct SpeedSegment 
{ 
     public float speed; 
     public float time; 
} 

终于GPSPoint是:

public struct GPSPoint 
    { 
      public float lat; 
      public float lon; 
      public float accuracy; 
      public float time; 

      public GPSPoint (float lat, float lon, float acc, float time) 
      { 
        this.lat = lat; 
        this.lon = lon; 
        this.accuracy = acc; 
        this.time = time; 
      } 
    } 

我遇到的问题是每个人hing可以在iOS以外的所有平台上完美工作。我可以生成我的XML文件,而无需在所有平台上的任何问题,但是当我尝试读他们在iOS上,我得到以下错误:

XmlException: Document element did not appear. Line 1, position 1.
at Mono.Xml2.XmlTextReader.Read() [0x00000] in :0 at System.Xml.XmlTextReader.Read() [0x00000] in :0 at System.Xml.XmlReader.MoveToContent() [0x00000] in :0 at System.Xml.Serialization.XmlSerializationReaderInterpreter.ReadRoot() [0x00000] in :0 at System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.Serialization.XmlSerializationReader reader) [0x00000] in :0

任何建议,什么可能导致此?

我猜这是iOS特有的东西,因为该解决方案在Android,Standalone和编辑器内工作正常。

编辑 - 这里是我试图解析XML文件:

http://hastebin.com/tilareququ.xml(太长,直接粘贴)

最后,这里是我使用的序列化/反序列化方法:

public static void WriteXML (string fileName, object obj) 
    { 
      using (var f = File.Create (fileName)) { 
        XmlSerializer ser = new XmlSerializer (obj.GetType()); 
        ser.Serialize (f, obj); 
      } 
    } 

    public static T ReadXML<T> (string fileName) 
    { 
      using (var f = File.Open (fileName, FileMode.Open, FileAccess.Read)) { 
        XmlSerializer ser = new XmlSerializer (typeof(T)); 
        return (T)ser.Deserialize (f); 
      } 
    } 
+0

有人可以帮忙吗? – kUr4m4

+0

你可以发布你正在尝试阅读的XML文件吗? – Mobiletainment

+0

它的时间太长了,我应该把它存储在什么地方,并提供一个链接呢? – kUr4m4

回答

1

我的教育猜测是您在文档中包含了BOM(Unicode字节顺序标记)。这些是指定文件编码的3个字节。 BOM是在XML文件的开头编写的。因此,在使用XMLTextReader读取文件时,它会抱怨文档没有以元素开始,因为读取了BOM。

我的建议是指定在编写XML文件时不要写BOM。你可以通过假以UTF8Encoding做到这一点:new System.Text.UTF8Encoding(false);

例子:

XmlTextWriter xmlWriter = new XmlTextWriter(streamReader, new System.Text.UTF8Encoding(false)); 
//now the BOM is not written to your XML file 
+0

我现在无法检查它,但是我会尝试它,并将其标记为正确的答案,如果确实是问题:)我不明白的是,为什么这只会是iOS上的问题,而不是Android或Windows/OSX – kUr4m4

+0

不幸的是,平台或语言特定的差异总是发生,我相信你很快就会陷入进一步的陷阱。无论如何,我希望能为你解决它。 – Mobiletainment

+0

再次,我添加了我用于序列化/反序列化的方法,它使用XMLSerializer而不是您提供的XmlTextWriter。你知道XMLSerializer是否可以被告知不使用BOM?谢谢 – kUr4m4

0

您是否尝试过使用的StreamReader而非File.Open? StreamReader re = new StreamReader(fileName, System.Text.UTF8Encoding);

+0

我没有。会尝试让你知道:) – kUr4m4