Я могу отобразить входящие имена классов при помощи a SerializationBinder
и переопределение BindToType
метод, но я не нашел способа изменить имя класса в процессе сериализации. Действительно ли это возможно вообще??
Править:
Я обращаюсь к сериализации с помощью System.Runtime.Serialization
, а не System.Xml.Serialization
.
Спасибо!
Я обнаружил, что могу использовать объект SerializationInfo
, который появляется в функции GetObjectData
, и изменить свойства AssemblyName
и FullTypeName
, чтобы при десериализации использовать SerializationBinder
для сопоставления пользовательской сборки и имени типа обратно в действительный тип. Вот пример:
Serializable class:
[Serializable]
class MyCustomClass : ISerializable
{
string _field;
void MyCustomClass(SerializationInfo info, StreamingContext context)
{
this._field = info.GetString("PropertyName");
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AssemblyName = "MyCustomAssemblyIdentifier";
info.FullTypeName = "MyCustomTypeIdentifier";
info.AddValue("PropertyName", this._field);
}
}
SerializationBinder:
public class MyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
if (assemblyName == "MyCustomAssemblyIdentifier")
if (typeName == "MyCustomTypeIdentifier")
return typeof();
return null;
}
}
Serialization code:
var fs = GetStream();
BinaryFormatter f = new BinaryFormatter();
f.Binder = new MyBinder();
var obj = (MyCustomClass)f.Deserialize(fs);
Deserialization code:
var fs = GetStream();
MyCustomClass obj = GetObjectToSerialize();
BinaryFormatter f = new BinaryFormatter();
f.Deserialize(fs, obj);
I'm not sure if I follow you, but you could use XmlTypeAttribute. You can then easily retrieve its values through reflection.
[XmlType(Namespace = "myNamespaceThatWontChange",
TypeName = "myClassThatWontChange")]
public class Person
{
public string Name;
}
Check this out:
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute%28VS.100%29.aspx
Это можно сделать с помощью атрибутов:
[System.Xml.Serialization.XmlRoot("xmlName")]
public Class ClassName
{
}
Посмотрите на использование суррогатного + суррогатного селектора. Это вместе с привязкой к десериализации должно помочь.