3

请考虑这个示例类:

[Serializable]
public class SomeClass
{
    private DateTime _SomeDateTime;

    public DateTime SomeDateTime
    {
        get { return _SomeDateTime; }
        set { _SomeDateTime = value; }
    }
}

我想根据我自己的规则更改类中声明的任何 DateTime 的序列化。此类的成员会经常更改,我不想为每次更改都维护一个自定义序列化程序。此外,我希望这种行为由子类继承,而不是为每个子类编写自定义序列化程序。序列化由 Web 服务输出。谢谢你的帮助!

4

3 回答 3

3

您是否考虑过简单地使用 Nullable 日期时间

public DateTime? SomeDateTime {get; set;}

这样,您实际上可以将 null 值作为类中的合法值。通常,您希望尽可能避免自定义序列化。一旦您进行了自定义序列化(例如实现ISerializable),您就会坚持下去,并且所有其他派生类都坚持下去。

还记得必须始终为自定义异常覆盖 ISerializable 成员是多么痛苦吗?这是因为 System.Exception 实现了 ISerializable,因此如果您希望它们跨 AppDomains,所有派生的异常(这意味着一切)都必须实现这些成员。

于 2008-10-06T11:08:42.860 回答
3

查看 OnSerializing 和 OnDeserializing 属性以在您的对象被序列化时调用自定义方法。您可以在其中执行一些自定义逻辑,并将序列化过程与实际数据类型分离。

于 2008-10-06T14:13:46.467 回答
0

好吧,您可以使用“bool ShouldSerializeSomeDateTime()”方法来启用/禁用单个成员的序列化,但我认为这不是您所需要的。另一个常见的选项是添加一个执行格式本身的成员:

公共字符串 SomeDateTimeFormatted { get { return theField == DateTime.MinValue ?"" : theField.ToString("R");} // 或任何格式设置 { ... 相反 ...} }

不过,如果可以的话,最好坚持使用内置序列化 - 部分是为了减少您需要编写的代码量。Josh 对可为空的 DateTime(DateTime?)的建议是一个很好的建议,尽管它可能仍然不是很空字符串与格式化字符串 - 我希望它会使用 xsi:nil 标记。

于 2008-10-06T11:14:44.737 回答