我正在尝试通过以下代码进行序列化
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/