カートデン、
代わりに、XMLSerializerへの切り替えを検討することをお勧めします。これが私が時間をかけて決定したことです:
XMLSerializerクラスとDataContractSerializerクラスは、XMLとの間でオブジェクトグラフをシリアル化および逆シリアル化する簡単な手段を提供します。
主な違いは次のとおり
です。1。
[XmlElement]の代わりに[XmlAttribute]を使用すると、XMLSerializerのペイロードはDCSよりもはるかに小さくなります
。DCSは
常に値を要素として格納します。2。DCS
は「オプトアウト」ではなく「オプトイン」
です。 [DataMember]でシリアル化するものを明示的にマークするDCSを使用する
と、保護またはプライベートとしてマークされている場合でも、任意のフィールドまたはプロパティをシリアル化
できます。DCSを使用すると、[IgnoreDataMember]を使用してシリアライザーに特定のプロパティを無視させることができます。
XMLSerializerを使用すると、パブリックプロパティがシリアル化され、セッターを逆シリアル化する必要があり
ます。XmlSerializerを使用すると、[XmlIgnore]を使用して、シリアライザーにパブリックプロパティを無視させることができ
ます
。
DCS.ReadObjectは、逆シリアル化中にコンストラクターを呼び出さない
初期化を実行する必要がある場合、DCSは次のコールバックフックをサポートします:
[OnDeserializing]、[OnDeserialized]、[OnSerializing]、[OnSerialized]
(バージョン管理の問題の処理にも役立ちます
) 2つのシリアライザーを切り替える機能では、次のように、両方の属性セットを同時に使用できます。
[DataContract]
[XmlRoot]
public class ProfilePerson : NotifyPropertyChanges
{
[XmlAttribute]
[DataMember]
public string FirstName { get { return m_FirstName; } set { SetProperty(ref m_FirstName, value); } }
private string m_FirstName;
[XmlElement]
[DataMember]
public PersonLocation Location { get { return m_Location; } set { SetProperty(ref m_Location, value); } }
private PersonLocation m_Location = new PersonLocation(); // Should change over time
[XmlIgnore]
[IgnoreDataMember]
public Profile ParentProfile { get { return m_ParentProfile; } set { SetProperty(ref m_ParentProfile, value); } }
private Profile m_ParentProfile = null;
public ProfilePerson()
{
}
}
また、2つを切り替えることができる私のSerializerクラスをチェックしてください:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace ClassLibrary
{
// Instantiate this class to serialize objects using either XmlSerializer or DataContractSerializer
internal class Serializer
{
private readonly bool m_bDCS;
internal Serializer(bool bDCS)
{
m_bDCS = bDCS;
}
internal TT Deserialize<TT>(string input)
{
MemoryStream stream = new MemoryStream(input.ToByteArray());
if (m_bDCS)
{
DataContractSerializer dc = new DataContractSerializer(typeof(TT));
return (TT)dc.ReadObject(stream);
}
else
{
XmlSerializer xs = new XmlSerializer(typeof(TT));
return (TT)xs.Deserialize(stream);
}
}
internal string Serialize<TT>(object obj)
{
MemoryStream stream = new MemoryStream();
if (m_bDCS)
{
DataContractSerializer dc = new DataContractSerializer(typeof(TT));
dc.WriteObject(stream, obj);
}
else
{
XmlSerializer xs = new XmlSerializer(typeof(TT));
xs.Serialize(stream, obj);
}
// be aware that the Unicode Byte-Order Mark will be at the front of the string
return stream.ToArray().ToUtfString();
}
internal string SerializeToString<TT>(object obj)
{
StringBuilder builder = new StringBuilder();
XmlWriter xmlWriter = XmlWriter.Create(builder);
if (m_bDCS)
{
DataContractSerializer dc = new DataContractSerializer(typeof(TT));
dc.WriteObject(xmlWriter, obj);
}
else
{
XmlSerializer xs = new XmlSerializer(typeof(TT));
xs.Serialize(xmlWriter, obj);
}
string xml = builder.ToString();
xml = RegexHelper.ReplacePattern(xml, RegexHelper.WildcardToPattern("<?xml*>", WildcardSearch.Anywhere), string.Empty);
xml = RegexHelper.ReplacePattern(xml, RegexHelper.WildcardToPattern(" xmlns:*\"*\"", WildcardSearch.Anywhere), string.Empty);
xml = xml.Replace(Environment.NewLine + " ", string.Empty);
xml = xml.Replace(Environment.NewLine, string.Empty);
return xml;
}
}
}