更改.Net中序列化的类的名称?

时间:2010-02-10 12:41:03

标签: c# .net serialization

我可以使用SerializationBinder映射传入的类名并覆盖BindToType方法,但我发现无法在序列化过程中更改类的名称。它有可能吗?

修改

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

谢谢!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

我发现我可以使用SerializationInfo函数中的GetObjectData对象,并更改AssemblyNameFullTypeName属性,这样当我反序列化时可以使用SerializationBinder将自定义程序集和类型名称映射回有效类型。这是一个问题:

可序列化的类:

[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);

答案 2 :(得分:2)

您可以使用属性执行此操作:

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

答案 3 :(得分:0)

使用代理+代理选择器。与反序列化的绑定器一起应该可以解决问题。