【问题标题】:XML Serialization in Unity iOS exceptionUnity iOS 异常中的 XML 序列化
【发布时间】:2014-04-10 14:33:42
【问题描述】:

我正在尝试读/写一个 xml 文件来为我的游戏存储一些数据。这是我要存储的对象:

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

我遇到的问题是,除了 iOS 之外,所有平台都可以正常运行。我可以在所有平台上毫无问题地生成我的 XML 文件,但是当我尝试在 iOS 上读取它们时,我收到以下错误:

XmlException:文档元素未出现。第 1 行,位置 1。
在 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] 在 :0 处 System.Xml.Serialization.XmlSerializer.Deserialize (System.Xml.Serialization.XmlSerializationReader 阅读器)[0x00000] 在 :0

关于可能导致此问题的任何建议?

我猜它是 iOS 特有的,因为该解决方案在 Android、独立和编辑器内部都可以正常工作。

编辑- 这是我要解析的 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);
            }
    }

【问题讨论】:

  • 您可以发布您正在尝试阅读的 xml 文件吗?
  • 这里发布太长了,我应该把它存储在某个地方并提供一个链接吗?
  • 发布前几行是可以的,或者至少总比没有好,只是为了验证错误是否可能是由 xml 文件本身引起的。此外,带有完整内容的jsfiddle.net 将有助于检查 XML 是否格式错误或类似情况..
  • 我遇到了类似的问题。这个问题你解决了吗?
  • 我没有,我最终改用了 json 文件。

标签: c# ios unity3d xml-serialization


【解决方案1】:

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

我的建议是在编写 XML 文件时指定您不希望编写 BOM。您可以通过将 false 传递给 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

【讨论】:

  • 我现在无法检查,但如果确实是问题,我会尝试并将其标记为正确答案:) 我不明白为什么这只会在 iOS 上成为问题而不是在 Android 或 Windows/OSX 上
  • 不幸的是,平台或语言特定的差异一直在发生,我相信您很快就会发现更多的陷阱。无论如何,我希望能为你解决它。
  • 您好,我添加了用于序列化/反序列化的方法,这些方法使用 XMLSerializer 而不是您提供的 XmlTextWriter。你知道是否可以告诉 XMLSerializer 不使用 BOM?谢谢
  • 添加了您的代码并检查 XML 文件是否不再包含 BOM,但恐怕仍然会弹出相同的错误。
  • 找不到此问题的有效解决方案。将数据存储在文本文件中,然后自己将其解析回相关数据。
【解决方案2】:

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

【讨论】:

  • 我没有。会尽力让你知道:)
猜你喜欢
  • 2023-03-16
  • 2021-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多