slugster,
Возможно, вы захотите вместо этого перейти на XMLSerializer. Вот что я определил со временем:
Классы XMLSerializer и DataContractSerializer предоставляют простые средства сериализации и десериализации графов объектов в и из XML.
Ключевые отличия:
1.
XMLSerializer имеет гораздо меньшую полезную нагрузку, чем DCS, если вы используете [XmlAttribute] вместо [XmlElement]
DCS всегда хранит значения как элементы
2.
DCS является «opt-in», а не «opt-out»
В DCS вы явно помечаете то, что хотите сериализовать, с помощью [DataMember]
С помощью DCS вы можете сериализовать любое поле или свойство, даже если они помечены как защищенные или закрытые.
С DCS вы можете использовать [IgnoreDataMember], чтобы сериализатор игнорировал определенные свойства
С XMLSerializer открытые свойства сериализуются, и для десериализации нужны сеттеры
С XmlSerializer вы можете использовать [XmlIgnore], чтобы сериализатор игнорировал общедоступные свойства
3.
БУДЬТЕ ВНИМАТЕЛЬНЫ! DCS.ReadObject НЕ вызывает конструкторы во время десериализации
Если вам нужно выполнить инициализацию, DCS поддерживает следующие перехваты обратного вызова:
[OnDeserializing], [OnDeserialized], [OnSerializing], [OnSerialized]
(также полезно для решения проблем с версиями)
Если вам нужна возможность переключения между двумя сериализаторами, вы можете использовать оба набора атрибутов одновременно, как в:
[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()
{
}
}
Кроме того, проверьте мой класс 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;
}
}
}
Удачи,
Джим МакКарди
Face To Face Software и YinYangMoney