当前位置: 首页 > 知识库问答 >
问题:

尝试使用DataContractSerializer反序列化int列表时,收到意外的InvalidOperationException

沙岳
2023-03-14

期望:将XML文件中的整数列表读取到名为itemPool的列表中;

结果:“InvalidOperationException:未能将类型System.Collections.Generic.List`1[System.Int32]添加到已知的类型集合中。已为XML名称注册了一个类型http://schemas.microsoft.com/2003/10/Serialization/Arrays:ArrayOfint"

我必须遵循代码:

using System.Collections.Generic;
using System.Runtime.Serialization;

using Characters;
using Items;

[DataContract(Name ="Savefile", Namespace ="")]
public class Savefile
{
    [DataMember(Name ="Characters")]
    public List<Character> characters = new List<Character>();

    [DataMember(Name = "ItemPool")]
    public List<int> itemPool = new List<int>();

    public void Initialize()
    {
        foreach (Character c in characters)
            c.Initialize();

        ItemPool.Load(itemPool.ToArray());
    }
}

另一个类使用下面的方法:

    public static void LoadFromSavefile()
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(Savefile));
        FileStream stream = new FileStream(Path.Combine(Application.dataPath, _savefilePath), FileMode.Open);

        _currentSave = serializer.ReadObject(stream) as Savefile;

        stream.Close();
    }

以及上面的类从中读取的以下xml文件。

<?xml version="1.0" encoding="utf-8"?>
<Savefile xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Characters>
    <Character>
      <... not relevant clutter.../>
    </Character>
  </Characters>
  <ItemPool>
    <value>1</value>
  </ItemPool>
</Savefile>

共有1个答案

卫骏
2023-03-14

使用DataContractSerializer编辑。

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Runtime.Serialization;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace UnitTestProject1 {

    [DataContract(Name = "Savefile", Namespace = "")]
    public class Savefile {
        [DataMember(Name = "Characters", Order = 0)]
        public Characters Characters { get; private set; }

        [DataMember(Name = "ItemPool", Order = 1)]
        public Items ItemPool { get; private set; }

    }

    [CollectionDataContract(Name = "Characters", ItemName = "Character", Namespace = "")]
    public class Characters : List<Character> {

    }

    public class Character {
        public string Weapon { get; set; }
        internal void Initialize() {
            throw new NotImplementedException();
        }
    }

    [CollectionDataContract(Name = "ItemPool", ItemName = "Item", Namespace = "")]
    public class Items : List<int> {
        public int value { get; set; }
    }

    [TestClass]
    public class UnitTestSerialization {
        [TestMethod]
        public void TestMethod1() {
            DataContractSerializer serializer = new DataContractSerializer(typeof(Savefile));
            FileStream stream = new FileStream("SaveFile2.xml", FileMode.Open);
            XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());

            Savefile _currentSave = (Savefile)serializer.ReadObject(reader);
            Assert.IsNotNull(_currentSave);


            stream.Close();
        }
    }
}

xml文件

<?xml version="1.0" encoding="utf-8"?>
<Savefile>
  <Characters>
    <Character>
      <Weapon>Axe</Weapon>
    </Character>
    <Character>
      <Weapon>Mace</Weapon>
    </Character>
    <Character>

    </Character>
  </Characters>
  <ItemPool>
    <Item>1</Item>
    <Item>2</Item>
  </ItemPool>
</Savefile>
 类似资料:
  • 我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。

  • 问题内容: 我需要在Python中创建列表列表,因此输入了以下内容: 该列表如下所示: 然后,我更改了最内在的值之一: 现在我的列表如下所示: 这不是我想要或期望的。有人可以解释发生了什么,以及如何解决吗? 问题答案: 当您编写时,您基本上得到了。也就是说,具有3个对same的引用的列表。然后,当您修改此单曲时x,可以通过对其的所有三个引用来看到它: 要修复它,您需要确保在每个位置创建一个新列表。

  • 问题内容: 我尝试反序列化包含null属性并具有的对象。 我做的事: 但是 :如果扔掉财产-一切正常!我的意思是传递下一个字符串: 问题 :如何避免此异常或保证杰克逊在序列化期间忽略空值? 抛出: 信息: 原因: 原因: 问题答案: 如果您不想序列化值,则可以使用以下设置(序列化期间): 希望这能解决您的问题。 但是反序列化过程中获得的结果对我来说似乎很可疑(理想情况下,杰克逊应该能够处理序列化输

  • 我试图使用一个服务,它给我一个实体,它的字段是一个数组。 但是,当数组包含单个项时,将返回项本身,而不是返回一个元素的数组。 在这种情况下,Jackson无法转换为我的Java对象。 有一个简单的解决方案吗?

  • 我有这样一个实体: 和相关的JSON: 我试图在Spring MVC@Controller中以如下方式对其进行反序列化: 添加

  • 问题内容: 在Apache Jackson和Jackson一起使用Apache Jersey进行JSON序列化时(在服务器和客户端上),在反序列化通用List时遇到问题。 我正在生成的JSON如下,“数据”中的所有3个类都实现“ CheckStatusDetail”: 产生此JSON的对象如下所示,我在客户端使用相同的类: 自从我将此注释添加到我的CheckStatusDetail接口后,就应用了