【问题标题】:C# Can't deserialize xml to return a generic ListC# 无法反序列化 xml 以返回通用列表
【发布时间】:2020-01-08 15:09:21
【问题描述】:

我尝试从 xml 文件加载列表。我有不同的自定义类列表和不同的 xml 文件。计划是创建一种能够像这样反序列化所有它们的方法:

ListDependencies.Deserialize(DependenciesPath);
ListProfessions.Deserialize(ProfessionsPath);
ListCategories.Deserialize(CategoriesPath);
...

反序列化时,我收到 xml 文件具有意外格式的错误。

    public static List<T> Deserialize<T>(this T value, string _path)
    {
        var xmlserializer = new XmlSerializer(typeof(List<T>));

        using (StreamReader sr = new StreamReader(_path, Encoding.Unicode))
        {
            using (var reader = XmlReader.Create(sr.BaseStream))
            {
                return (List<T>)xmlserializer.Deserialize(reader);
            }
        }
    }

内部异常:

{"&lt;ArrayOfDependencyObject xmlns=''&gt; was not expected."} System.Exception {System.InvalidOperationException}

Xml 内容:

<ArrayOfDependencyObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <DependencyObject>
    <Profession>80dd893e-9eb6-42c6-9b60-a61b87df0d1b</Profession>
    <Dependency>f76c72be-f2da-435b-b1f8-a4775c0bc1f1</Dependency>
  </DependencyObject>
  <DependencyObject>
    <Profession>8ab9b108-dd4b-4639-b323-c7a6c28f1314</Profession>
    <Dependency>9b86ff1d-c1de-4f95-adc8-413a94714cc0</Dependency>
  </DependencyObject>
  <DependencyObject>
    <Profession>5a273efa-eb29-4ea0-bd1d-2bb84727aa1e</Profession>
    <Dependency>954bd3d6-e78e-424e-bd69-8b46f239c5f2</Dependency>
  </DependencyObject>
</ArrayOfDependencyObject>

谁能帮帮我?

【问题讨论】:

  • 您是否尝试将命名空间添加到序列化程序?喜欢这里example
  • 你注意到你没有在你的扩展方法中使用“值”,除了类型推断?你传递了一个 ListDependencies 变量,但你没有对它做任何事情。
  • 这能回答你的问题吗? Deserializing xml, including namespace
  • @leo_acm94 我不确定要添加哪些标题。据我了解,这篇文章是关于反序列化一个带有该人无法删除的标头的 xml。
  • @Holger 这也是我不完全理解的部分。如果我添加“这个 T 值”,我可以直接从我的列表中调用该方法(ListDependencies.Deserialize(_path)。如果我删除它,我不能再这样做了。我以某种方式认为应该可以获得列表的类型我正在调用该方法并相应地转换返回值: ListDependencies.Deserialize() -> return List ListCategories.Deserialize() -> return List etc

标签: c# xml deserialization generic-list


【解决方案1】:

我从XML 看到的是一个包含元素数组的对象。如下更改Deserialize方法,然后重试

public static T Deserialize<T>(this T value, string _path)
{
    var xmlserializer = new XmlSerializer(typeof(T));

    using (StreamReader sr = new StreamReader(_path, Encoding.Unicode))
    {
        using (var reader = XmlReader.Create(sr.BaseStream))
        {
            return (T)xmlserializer.Deserialize(reader);
        }
    }
}

我已经用给定的 XML 尝试过这种方法

var ListDependencies = new ArrayOfDependencyObject();
var results = ListDependencies.Deserialize(xmlFile);
foreach (var element in results.DependencyObject)
{
    Console.WriteLine($"{element.Profession}:{element.Dependency}");
}

得到这个输出

80dd893e-9eb6-42c6-9b60-a61b87df0d1b:f76c72be-f2da-435b-b1f8-a4775c0bc1f1
8ab9b108-dd4b-4639-b323-c7a6c28f1314:9b86ff1d-c1de-4f95-adc8-413a94714cc0
5a273efa-eb29-4ea0-bd1d-2bb84727aa1e:954bd3d6-e78e-424e-bd69-8b46f239c5f2

【讨论】:

  • 这工作得更好。我已经按照您的建议调整了反序列化方法,并且能够使用以下代码获取列表:var result = ListDependencies.Deserialize(DependenciesPath);ListDependencies = (List&lt;DependencyObject&gt;)result; 所以现在最好的结果。有没有办法获取 List 的类型并在 Deserialize 方法中进行强制转换?
  • 其实这就是解决方案。它也适用于“ListProfessions = ListProfessions.Deserialize(Path)”。不需要演员表。所以谢谢你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2011-09-17
  • 1970-01-01
  • 2019-03-11
  • 2015-09-24
相关资源
最近更新 更多