は、私は次のクラスに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を友好的なフォーマットではありません。
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
がされている:これは、次のexpectionになり
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;
}
:私はその後、私のオーバーライドを設定
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); }
}
}
:mulitple質問への回答に基づいて、私はこのクラスを追加しました日付の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));
をそして、それは一つのクラスと3つのプロパティの罰金だ
それは私が切り替えた場合、動作します。しかし、私は合計で3ダースの日付のプロパティを持つ14のクラスを持っています。 14クラスのオーバーライドを追加する必要があることはわかっていますが、シリアライザですべてのDateTime
プロパティを無視する方法がありますか?
私はXmlAttributeOverrides.Add Method (Type, XmlAttributes)と思っていました。しかし、それは動作していません。どうして?この方法は何ですか?それは何をするためのものか?
XmlAttributeOverrides.Add(Type、XmlAttributes)は、逆シリアル化される型のみです。とった。 最後に、コードの各プロパティをリストしました。私は反射を考慮しましたが、コンピュータに3分かかると毎回把握したくなかったのです。 また、私はメモリリークの回答を見て、静的にXmlSerializerを使用しています。 そして、内部取得はデシリアライズのために機能しています。それが私がこのクラスで気にしている唯一の方向です。 ありがとうございます。 –