カスタムメソッドを使用して手動で処理し、適切な属性 OnSerializing/OnSerialized/OnDeserializing/OnDeserialized でマークし、値を初期化する方法を手動で決定する必要があります (可能な場合)。
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializingattribute.aspx
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.ondeserializedattribute.aspx
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializedattribute.aspx
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.onserializingattribute.aspx
より良い方法は、事前にバージョンを決定し、戦略パターンを使用して逆シリアル化を行うことです。これは常に可能であるとは限らないため、その場合は私が提案するものを使用してください。
更新:前の回答は、バイナリのシリアル化にのみ適用されます。通常の Xml の場合、このメソッドを使用できます。
class Program
{
static void Main(string[] args)
{
Deserialize(@"..\..\v1.xml");
}
private static Model Deserialize(string file)
{
XDocument xdoc = XDocument.Load(file);
var verAtt = xdoc.Root.Attribute(XName.Get("Version"));
Model m = Deserialize<Model>(xdoc);
IModelLoader loader = null;
if (verAtt == null)
{
loader = GetLoader("1.0");
}
else
{
loader = GetLoader(verAtt.Value);
}
if (loader != null)
{
loader.Populate(ref m);
}
return m;
}
private static IModelLoader GetLoader(string version)
{
IModelLoader loader = null;
switch (version)
{
case "1.0":
{
loader = new ModelLoaderV1();
break;
}
case "2.0":
{
loader = new ModelLoaderV2();
break;
}
case "3.0": { break; } //Current
default: { throw new InvalidOperationException("Unhandled version"); }
}
return loader;
}
private static Model Deserialize<T>(XDocument doc) where T : Model
{
Model m = null;
using (XmlReader xr = doc.CreateReader())
{
XmlSerializer xs = new XmlSerializer(typeof(T));
m = (Model)xs.Deserialize(xr);
xr.Close();
}
return m;
}
}
public interface IModelLoader
{
void Populate(ref Model model);
}
public class ModelLoaderV1 : IModelLoader
{
public void Populate(ref Model model)
{
model.City = string.Empty;
model.Phone = "(000)-000-0000";
}
}
public class ModelLoaderV2 : IModelLoader
{
public void Populate(ref Model model)
{
model.Phone = "(000)-000-0000";
}
}
public class Model
{
[XmlAttribute(AttributeName = "Version")]
public string Version { get { return "3.0"; } set { } }
public string Name { get; set; } //V1, V2, V3
public string City { get; set; } //V2, V3
public string Phone { get; set; } //V3 only
}
要件によっては、これをモデル (またはモデル ローダー) の単一のメソッドに簡略化できます。
これは、逆シリアル化後のモデルの検証にも使用できます。
編集:次のコードを使用してシリアル化できます
private static void Serialize(Model model)
{
XmlSerializer xs = new XmlSerializer(typeof(Model));
FileStream f = File.Create(@"..\..\v1.xml");
xs.Serialize(f, model);
f.Close();
}