请考虑这个示例类:
[Serializable]
public class SomeClass
{
private DateTime _SomeDateTime;
public DateTime SomeDateTime
{
get { return _SomeDateTime; }
set { _SomeDateTime = value; }
}
}
我想根据自己的规则更改类中声明的任何DateTime的序列化。此类的成员将经常更改,我不想为每个更改维护自定义序列化程序。此外,我希望子行程继承此行为,而不是为每个行为编写自定义序列化程序。序列化由Web服务输出。谢谢你的帮助!
答案 0 :(得分:3)
您是否考虑过简单地使用Nullable日期时间
public DateTime? SomeDateTime {get; set;}
这样,您实际上可以将null值作为类中的合法值。通常,您希望尽可能避免自定义序列化。一旦您执行自定义序列化,例如实施 ISerializable ,那么您就会陷入困境,并且所有其他派生类都会坚持使用它。
还记得,对于自定义异常,必须始终覆盖ISerializable成员的痛苦是什么?这是因为System.Exception实现了ISerializable,因此所有派生的异常(这意味着一切)必须实现这些成员,如果您希望它们跨越AppDomains。
答案 1 :(得分:3)
查看OnSerializing和OnDeserializing属性,以在序列化对象时调用自定义方法。你可以在那里强制一些自定义逻辑,并将序列化过程与实际数据类型分离。
答案 2 :(得分:0)
好吧,您可以使用“bool ShouldSerializeSomeDateTime()”方法来启用/禁用单个成员的序列化,但我认为这不是您所需要的。另一个常见选项是添加一个执行格式化的成员:
public string SomeDateTimeFormatted { get {return theField == DateTime.MinValue? “”:theField.ToString(“R”);} //或任何格式 设置{...对面...} }
如果可以的话,坚持使用内置序列化会更好 - 部分原因是为了减少需要编写的代码量。 Josh关于可以为空的DateTime(DateTime?)的建议是一个很好的建议,虽然它可能仍然不是很空 - 字符串与格式化字符串 - 我希望它会使用xsi:nil标记。