c# - XmlSerializer 不序列化自定义类型

标签 c# .net xml xml-serialization

我正在尝试通过以下代码进行序列化

var data = argsPerCall.ToArray();
var knownTypes = new[] { typeof(int), typeof(int),  
                         typeof(string), typeof(McPosition)};

var serializer = new XmlSerializer(data.GetType(), knownTypes);
// Writing the file requires a TextWriter.
var myStreamWriter = new StreamWriter(filename);
serializer.Serialize(myStreamWriter, data);
myStreamWriter.Close();

我遇到了 McPosition 类型的问题。

对于后续输入

5 , 1, "R251" , {1,2,3}

我正在关注连载

<ArrayOfAnyType>
    <anyType xsi:type="xsd:int">5</anyType>
    <anyType xsi:type="xsd:int">1</anyType>
    <anyType xsi:type="xsd:string">R251</anyType>
    <anyType xsi:type="McPosition" />
  </ArrayOfAnyType>

知道为什么它没有正确序列化吗?

编辑:

public struct McPosition : IComparable<McPosition> {
    private readonly int _station;
    private readonly int _slot;
    private readonly int _subslot;


    public static McPosition Empty = new McPosition(-1, -1, -1);


    public McPosition(int station, int slot, int subslot) {
      _station = station;
      _slot    = slot;
      _subslot = subslot;
    }

等....

谢谢。

最佳答案

要通过 XmlSerializer 序列化,类型上的每个属性必须有一个公共(public)的 getter 和 setter(并且不被标记为 [XmlIgnore]也没有返回 false 的 ShouldSerialize*() 等)。公共(public)字段也被序列化(只要它们不是 readonly),但公开字段更不可取。 XmlSerializer 从不查看私有(private)成员。

猜测(编辑:现在由更新的问题确认)McPosition 是一个不可变向量,没有公共(public) setter 。那行不通的。选项:

  • 实现 IXmlSerializable(老实说,不太好)
  • 将公共(public) setter 添加到 McPosition
  • 使用完全可变的单独 DTO

关于c# - XmlSerializer 不序列化自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7469244/

相关文章:

c# - 使用 LINQ 和 Entity Framework 使用可能为空的字段选择新的

c# - 从C#docker访问kubernetes服务

c# - 如何将一个组添加到多个内置功能区选项卡(vsto)?

c# - 我可以在 C# 中加载应用程序期间捕获丢失的 dll 错误吗?

c# - 将文件写入 Common Application Data 文件夹被拒绝

python - 使用 ElementTree 解析 XML 并出现自结束标记错误

c# - 从继承的 UserControl 获取初始尺寸

c# - 为什么 WPF Presentation 库在 StringBuilder.ToString() 中包装字符串?

java - 以通用方式从平面文件转换为 XML

xml - 是否允许自定义 XML 元素?