我使用WCF将一些对象转换为JSON。有时,有一个错误:
serialization exception:大于dateTime.maxvalue或小于datetime的dateTime值。转换为UTC时的minvalue不能序列化为JSON。
根据这篇文章,我可以通过设置来解决它类型DateTime
的对象此方式dt = DateTime.SpecifyKind(dt, DateTimeKind.Utc)
。当我的班级没有复合时,这足够解决,例如:
public class MyObj : BaseObj
{
[XmlElement(Order = 0, ElementName = "name")]
public string Name { get; set; }
[XmlElement(Order = 1, ElementName = "xDate")]
public DateTime? XDate { get; set; }
[XmlElement(Order = 2, ElementName = "yDate")]
public DateTime YDate { get; set; }
}
[Serializable]
public class BaseObj
{
[XmlElement(Order = 0,ElementName = "pDate")]
public DateTime? PDate { get; set; }
[XmlElement(Order = 1, ElementName = "qDate")]
public DateTime QDate { get; set; }
}
编辑:
我实际上并未创建MyObj
的实例。我通过了该对象并在其周围创建一个包装器
/*..some factory creates the instance `mo` and returns it...*/
MyObjWrapper wrapped = new MyObjWrapper() {MyObject = mo};
public class MyObjWrapper{
[XmlIgnore]
private MyObj _myObject;
[XmlElement(Order = 0, ElementName = "Arg1")]
public MyObj MyObject {
get{ return _myobject; }
set{
value.GetType().GetProperties().ToList().ForEach(
m => { if (m.PropertyType.Equals(typeof(DateTime))) m.SetValue(value, DateTime.SpecifyKind((DateTime)m.GetValue(value), DateTimeKind.Utc)); });
_myobject = value;
}
}
}
当课程更复杂时,我该怎么办(即它的成员也是用户定义的类,其中包含不可解开的日期时间)?我不能将成员设置为可无效的DateTime?
。示例:
public class MyObj : BaseObj
{
[XmlElement(Order = 0, ElementName = "name")]
public string Name { get; set; }
[XmlElement(Order = 1, ElementName = "xDate")]
public DateTime? XDate { get; set; }
[XmlElement(Order = 2, ElementName = "yDate")]
public DateTime YDate { get; set; }
[XmlElement(Order = 3, ElementName = "kaBoom")]
public AnotherObj KaBoom {get; set;} /*This contains a non-nullable DateTime member which causes the exception */
}
[Serializable]
public class AnotherObj
{
[XmlElement(Order = 0,ElementName = "objID")]
public int ObjID {get; set;}
[XmlElement(Order = 1,ElementName = "anotherDate")]
public DateTime AnotherDate {get; set;}
}
您可以在JSON对象定义中使用此解决方法
[IgnoreDataMember]
public DateTime dateObject;
public string dateCustomSerialize
{
get {
//Custom get
}
set {
//Custom set
}
}