2010-02-10 48 views
8

我可以通过使用SerializationBinder并覆盖BindToType方法来映射传入的类名称,但是我没有发现在序列化过程中更改类的名称的方法。有没有可能?更改.Net中正在序列化的类的名称?

编辑:

我指的是序列化使用System.Runtime.Serialization,而不是System.Xml.Serialization

谢谢!

+0

你能描述一下我为什么你要这么做?我经常发现,如果没有一个函数/方法来实现我想要做的事情,那么我错过了一个更简单的解决方案,或者我只是想做一些奇怪的事情。 – Lazarus 2010-02-10 12:44:09

+0

我想这样做,使序列化和反序列化的过程独立于类名称,以便如果我重命名类或更改类的命名空间,序列化和反序列化根本不会改变。 – 2010-02-10 12:49:46

+0

你正在执行什么类型的序列化?二进制? XML?其他? – 2010-02-10 12:56:13

回答

6

我发现我可以使用自带的GetObjectData功能SerializationInfo对象,并更改AssemblyNameFullTypeName属性,所以,当我反序列化,我可以用一个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); 
+0

按照预期使用List 执行此项工作? – 2013-06-27 00:13:14

9

我不确定如果我关注你,但你可以使用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

+0

但是这是XmlSerialization,我正在谈论使用SerializableAttribute和ISerializable接口的序列化。 – 2010-02-10 13:21:00

+0

伊斯兰教易卜拉欣的回答是'那个'答案(据我所知)。 – Pedro 2010-02-10 13:37:28

2

你可以用属性做到这一点:

[System.Xml.Serialization.XmlRoot("xmlName")] 
public Class ClassName 
{ 
} 
0

看看使用替代+替代选择。与反序列化中的绑定一起应该做到这一点。

+0

这非常有趣,但它不是我想要的。我发现我可以使用'GetObjectData'的'SerializationInfo'对象并改变'AssemblyName'和'FullTypeName'属性。 – 2010-02-10 16:10:24

+1

这是非常危险的方式,您可能需要序列化实例不区分上下文。即层之间的数据传输,克隆,距离等。如果你确实走这条路线,一定要指定流式上下文。 (example) formatter.Context = new System.Runtime.Serialization.StreamingContext(System.Runtime.Serialization.StreamingContextStates.CrossMachine); 并且请注意,您将被绑定到您命名项目的活页夹。 – MaLio 2010-02-11 11:16:39

相关问题