Mig*_*elo 8 .net c# serialization
我可以通过使用SerializationBinder和覆盖BindToType方法来映射传入的类名,但我发现无法在序列化过程中更改类的名称.有可能吗?
编辑:
我指的是使用的序列化System.Runtime.Serialization,而不是System.Xml.Serialization.
谢谢!
Ped*_*dro 10
我不确定我是否关注你,但你可以使用XmlTypeAttribute.然后,您可以通过反射轻松检索其值.
[XmlType(Namespace = "myNamespaceThatWontChange",
TypeName = "myClassThatWontChange")]
public class Person
{
public string Name;
}
Run Code Online (Sandbox Code Playgroud)
看一下这个:
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute%28VS.100%29.aspx
我发现我可以使用函数中的SerializationInfo对象GetObjectData,并更改AssemblyName和FullTypeName属性,这样当我反序列化时,我可以使用a SerializationBinder将自定义程序集和类型名称映射回有效类型.这是一个semple:
可序列化类:
[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);
}
}
Run Code Online (Sandbox Code Playgroud)
SerializationBinder:
public class MyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
if (assemblyName == "MyCustomAssemblyIdentifier")
if (typeName == "MyCustomTypeIdentifier")
return typeof();
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
序列化代码:
var fs = GetStream();
BinaryFormatter f = new BinaryFormatter();
f.Binder = new MyBinder();
var obj = (MyCustomClass)f.Deserialize(fs);
Run Code Online (Sandbox Code Playgroud)
反序列化代码:
var fs = GetStream();
MyCustomClass obj = GetObjectToSerialize();
BinaryFormatter f = new BinaryFormatter();
f.Deserialize(fs, obj);
Run Code Online (Sandbox Code Playgroud)