我可以通过使用SerializationBinder
并覆盖BindToType
方法来映射传入的类名称,但是我没有发现在序列化过程中更改类的名称的方法。有没有可能?更改.Net中正在序列化的类的名称?
编辑:
我指的是序列化使用System.Runtime.Serialization
,而不是System.Xml.Serialization
。
谢谢!
我可以通过使用SerializationBinder
并覆盖BindToType
方法来映射传入的类名称,但是我没有发现在序列化过程中更改类的名称的方法。有没有可能?更改.Net中正在序列化的类的名称?
编辑:
我指的是序列化使用System.Runtime.Serialization
,而不是System.Xml.Serialization
。
谢谢!
我发现我可以使用自带的GetObjectData
功能SerializationInfo
对象,并更改AssemblyName
和FullTypeName
属性,所以,当我反序列化,我可以用一个SerializationBinder
映射自定义程序集和类型名称回一个有效的类型。这里是一个森普尔:
Serializable类:
[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;
}
}
序列化代码:
var fs = GetStream();
BinaryFormatter f = new BinaryFormatter();
f.Binder = new MyBinder();
var obj = (MyCustomClass)f.Deserialize(fs);
反序列化代码:
var fs = GetStream();
MyCustomClass obj = GetObjectToSerialize();
BinaryFormatter f = new BinaryFormatter();
f.Deserialize(fs, obj);
按照预期使用List
我不确定如果我关注你,但你可以使用XmlTypeAttribute。然后,您可以通过反射轻松检索其值。
[XmlType(Namespace = "myNamespaceThatWontChange",
TypeName = "myClassThatWontChange")]
public class Person
{
public string Name;
}
检查了这一点:
http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute%28VS.100%29.aspx
但是这是XmlSerialization,我正在谈论使用SerializableAttribute和ISerializable接口的序列化。 – 2010-02-10 13:21:00
伊斯兰教易卜拉欣的回答是'那个'答案(据我所知)。 – Pedro 2010-02-10 13:37:28
你可以用属性做到这一点:
[System.Xml.Serialization.XmlRoot("xmlName")]
public Class ClassName
{
}
看看使用替代+替代选择。与反序列化中的绑定一起应该做到这一点。
这非常有趣,但它不是我想要的。我发现我可以使用'GetObjectData'的'SerializationInfo'对象并改变'AssemblyName'和'FullTypeName'属性。 – 2010-02-10 16:10:24
这是非常危险的方式,您可能需要序列化实例不区分上下文。即层之间的数据传输,克隆,距离等。如果你确实走这条路线,一定要指定流式上下文。 (example) formatter.Context = new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.CrossMachine); 并且请注意,您将被绑定到您命名项目的活页夹。 – MaLio 2010-02-11 11:16:39
你能描述一下我为什么你要这么做?我经常发现,如果没有一个函数/方法来实现我想要做的事情,那么我错过了一个更简单的解决方案,或者我只是想做一些奇怪的事情。 – Lazarus 2010-02-10 12:44:09
我想这样做,使序列化和反序列化的过程独立于类名称,以便如果我重命名类或更改类的命名空间,序列化和反序列化根本不会改变。 – 2010-02-10 12:49:46
你正在执行什么类型的序列化?二进制? XML?其他? – 2010-02-10 12:56:13