【问题标题】:Serializing to XML ArrayList<T> in .NET Core 3在 .NET Core 3 中序列化为 XML ArrayList<T>
【发布时间】:2021-10-14 00:32:28
【问题描述】:

有没有办法从.net core 3 中的控制器序列化ActionResult&lt;ArrayList&gt;,其中ArrayList 由某种类型T(在这种情况下为Person)组成。

它不会序列化为 XML,只会序列化为 JSON。它抱怨Person 的类型未知(即使它是已知的,并且它本身或作为数组序列化就好了)。

即序列化失败:

[HttpGet("List")]
public ActionResult<ArrayList> AllPersons() {...}

这行得通:

[HttpGet("List")]
public ActionResult<Person[]> AllPersons() {...}

所以Person 类型 (T) 可以自行很好地序列化,Person[] 也可以很好地序列化,但是当ArrayListPerson)的 XML 序列化失败时:

System.InvalidOperationException:生成错误 XML 文档。 ---> System.InvalidOperationException:类型 SimpleRESTServer.Models.Person 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。

Person 类型是静态已知的,PersonPerson[] 都可以很好地序列化):

[XmlInclude(typeof(Person))]
[Serializable]
public class Person ...

【问题讨论】:

  • 我无法评论为什么这段特定的代码不会运行,但是 ArrayList 的设计方式是所有项目都是“对象”,我怀疑这是导致问题的原因。有什么特殊的原因你不能像 arrayList.Cast 这样至少返回一个 IEnumerable 吗?
  • 你有一个继承了基类的类。 XmlInclude(typeof(Person) :XmlInclude 属于基类,typeof 是继承的类之一。对于每个继承的类,您需要在基类上方有一个 XmlInclude。您在同名的类上方有 Person . XmlInclude 的值必须与其上面的类不同。

标签: c# xml .net-core serialization


【解决方案1】:

ArrayList 一直是deprecated for quite a while。正如@MindingData mentioned in a commentArrayList 不是通用的。

您应该考虑使用List&lt;Person&gt; 而不是ArrayList。我大概有十年没见过ArrayList 使用过——大多数序列化框架可能不会优雅地处理它,至少部分是因为它既没有实现IEnumerable&lt;T&gt; 也没有实现ICollection&lt;T&gt;。迁移到较新的泛型集合类型可能会解决您在处理旧的、已弃用的非泛型集合类型时遇到的任何奇怪错误。

您可以在测试用例中使用object[] 而不是Person[] 来测试这个理论。 ArrayList 更接近于object[],而List&lt;Person&gt; 更接近于Person[]。 (话虽如此,一些序列化框架会正确处理object[],即使它们无法处理ArrayList,所以这不是一个完美的测试。)

【讨论】:

  • List 工作正常!实际上,控制器返回 public ActionResult> AllPersons() {...} 奇怪的是,进行此更改还修复了我同时发布的另一个问题:stackoverflow.com/questions/57649146/… 显然,ArrayList 不被相当多的人喜欢几件事!
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
相关资源
最近更新 更多