【问题标题】:Unable to deserialize object from xml file xamarin forms无法从 xml 文件 xamarin 表单反序列化对象
【发布时间】:2017-04-27 22:59:31
【问题描述】:

所以我试图在我的 xamarin 表单项目中序列化和反序列化一个名为 player 的对象。 这就是 Player 的样子:

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

我在Android项目中使用这些方法对对象进行序列化和反序列化。

    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;

    }

现在序列化部分运行良好,但在尝试反序列化时出现异常:

缺少根元素

我查看了生成的 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 可能正在写一些东西而无法读取它? 谢谢

编辑: 这是我现在如何调用它们进行测试的方式,序列化器是具有这两个功能的类。

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

【问题讨论】:

    标签: android xml serialization xamarin xamarin.forms


    【解决方案1】:

    在序列化过程中,代码会这样做:

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

    但是在反序列化过程中,它会这样做:

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

    您正在尝试反序列化 List,但您序列化了 Player,并且您的 XML 只显示一个 Player,而不是 List。你需要序列化和反序列化相同的类型。

    编辑

    第二个问题是在反序列化期间,代码尝试使用流两次:

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

    strm.ReadToEnd() 调用将消耗流,而没有任何内容可供 serializer.Deserialize 调用使用。要么去掉 strm.ReadToEnd() 调用(代码不使用'text'),反序列化'text',或者将流重置为调用之间的开头。

    【讨论】:

    • 是的,我刚才确实注意到了这个愚蠢的错误,但是在我纠正它之后,我得到了同样的错误:/
    • 请包含调用这些通用函数的代码以显示模板参数。
    • 我编辑了添加电话的帖子
    • 它只是为了测试,所以它并没有做任何特别的事情,只是为了调试但找不到问题
    • 嗯...看来我今天完全是愚蠢的哈哈...这个文本是我写的,所以我可以看到 XML 的样子,因为我找不到实际的文件我试过的手机..忘了删除它。非常抱歉浪费时间:)
    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多