我想反序列化XML到下面的类:如何让XmlSerializer忽略某个类型的所有成员?
public partial class Delivery
{
public System.Nullable<System.DateTime> sentDate { get; set; }
public System.Nullable<System.DateTime> receivedDate { get; set; }
public System.Nullable<System.DateTime> responseDueDate { get; set; }
}
然而,在XML的日期是不是在一个XmlSerializer友好的格式。基于答案多张的问题,我加入这个类:
public partial class DateSafeDelivery : Delivery
{
[XmlElement("sentDate")]
public string sentDateString
{
internal get { return sentDate.HasValue ? XmlConvert.ToString(sentDate.Value) : null; }
set { sentDate = DateTime.Parse(value); }
}
[XmlElement("receivedDate")]
public string receivedDateString
{
internal get { return receivedDate.HasValue ? XmlConvert.ToString(receivedDate.Value) : null; }
set { receivedDate = DateTime.Parse(value); }
}
[XmlElement("responseDueDate")]
public string responseDueDateString
{
internal get { return responseDueDate.HasValue ? XmlConvert.ToString(responseDueDate.Value) : null; }
set { responseDueDate = DateTime.Parse(value); }
}
}
然后配置我重写:
private static XmlAttributeOverrides GetOverrides()
{
var overrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes();
attributes.XmlElements.Add(new XmlElementAttribute(typeof(DateSafeDelivery)));
overrides.Add(typeof(MyParent), "Delivery", attributes);
var ignore = new XmlAttributes { XmlIgnore = true };
overrides.Add(typeof(DateTime?), ignore);
return overrides;
}
这将导致以下厚望:
Message=The string '2010-06-12T00:00:00 -05:00' is not a valid AllXsd value.
Source=System.Xml.ReaderWriter
StackTrace:
at System.Xml.Schema.XsdDateTime..ctor(String text, XsdDateTimeFlags kinds)
at System.Xml.XmlConvert.ToDateTime(String s, XmlDateTimeSerializationMode dateTimeOption)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDeserializedAudit.Read1_NullableOfDateTime(Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDeserializedAudit.Read15_DateSafeDelivery(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderDeserializedAudit.Read16_MyParent(Boolean isNullable, Boolean checkType)
所以DateSafeDelivery
是被使用,但日期的XmlIgnore
正在被忽略。
它会工作,如果我转:
overrides.Add(typeof(DateTime?), ignore);
有:
new Dictionary<string, Type>()
{
{ "sentDate", typeof(Delivery) },
{ "receivedDate", typeof(Delivery) },
{ "responseDueDate", typeof(Delivery) },
}
.ToList()
.ForEach(t1 => overrides.Add(t1.Value, t1.Key, ignore));
而且,对于一类三次性很好。但是我有14个类共有三十个日期属性。我知道我必须为14个类添加覆盖,但是有没有办法让序列化程序忽略所有DateTime
属性?
我以为XmlAttributeOverrides.Add Method (Type, XmlAttributes)会做到这一点。但它不起作用。为什么?这种方法是什么?它有什么作用?
因此,XmlAttributeOverrides.Add(Type,XmlAttributes)仅适用于被反序列化的类型。得到它了。 最后,我列出了代码中的每个属性。我考虑过反思,但不希望计算机每次都能弄清楚我花了3分钟才能说出来。 此外,我看到内存泄漏的答案,并静态使用XmlSerializer。 而内部获取正在为反序列化工作。这是我关心这门课程的唯一方向。 谢谢。 –