Change the name of the class being serialized in .Net?
I can map incoming class names by using a SerializationBinder
and overriding the BindToType
method, but I found no way of changing the name of the class in the serialization process. Is it possible at all??
EDIT:
I am referring to the serialization using the System.Runtime.Serialization
, and not the System.Xml.开发者_StackOverflow中文版Serialization
.
Thanks!
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
I found out that I can use the SerializationInfo
object that comes in the GetObjectData
function, and change the AssemblyName
and FullTypeName
properties, so that when I deserialize I can use a SerializationBinder
to map the custom assembly and type-name back to a valid type. Here is a semple:
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);
You can do it with attributes:
[System.Xml.Serialization.XmlRoot("xmlName")]
public Class ClassName
{
}
Look at using a surrogate + surrogate selector. That together with a binder on the deserialization should do the trick.
精彩评论