【问题标题】:Failed deserializing XML due to object names mismatch由于对象名称不匹配而导致反序列化 XML 失败
【发布时间】:2019-11-25 10:17:19
【问题描述】:

我尝试将 XML 对象反序列化为模型,但由于解析错误而失败。

我的代码是:

[XmlType(AnonymousType = true)]
[XmlRoot(ElementName = "Status", Namespace = "", IsNullable = false)]
public class SomeClass
    {

    public DateTime? LastStatusUpdate;

    [XmlElement("LastStatusUpdate")]
    public string LastStatusUpdateString
    {
       set { LastStatusUpdate = !string.IsNullOrEmpty(value) ? XmlConvert.ToDateTime(value, XmlDateTimeSerializationMode.Unspecified) : (DateTime?)null; }
    }
    }

由于xmlElement和DateTime对象同名,反序列化失败。 当我更改 DateTime 参数的名称时,它起作用了。

为什么?

【问题讨论】:

  • 失败的原因是 LastStatusUpdate 被声明为 public。将其设为私有,它应该可以工作。
  • @jdweng 虽然 会起作用,但 IMO 并不是解决它的最佳方法,因为它也可以在不影响可访问性的情况下轻松修复。
  • @Marc Gravell:绝对错误!!!你看代码了吗? OP 正在使用“集合”将自定义 DataTime 字符串转换为对象。所以该属性必须是私有的,这样序列化程序才不会序列化这两个属性。
  • @shlosi :根据我的经验,Xml 序列化程序似乎总是需要一个 GET 属性,并且不能仅使用 SET 。上周我只尝试了一个 SET,但没有成功。
  • @jdweng 感谢您的侮辱,我显然对与序列化相关的所有内容一无所知...我一定想象过[XmlIgnore]...

标签: c# xml serialization types model


【解决方案1】:

只要把[XmlIgnore]加到LastStatusUpdate上,它就知道不看了。然后另一个LastStatusUpdateString[XmlElement("LastStatusUpdate")])应该可以正常工作。

默认情况下,XmlSerializer 就像每个公共成员 Foo 都有 [XmlElement] 一样工作,这会将其视为与成员同名的元素(例如:<Foo>)。

LastStatusUpdate 上没有get 似乎也很奇怪——感觉应该有一个:

get => LastStatusUpdate == null ? null :
    XmlConvert.ToString(LastStatusUpdate.Value, XmlDateTimeSerializationMode.Unspecified);

public bool ShouldSerializeLastStatusUpdateString() => LastStatusUpdate.HasValue;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多