Изменить имя класса, сериализируемого в .NET?

Я могу отобразить входящие имена классов при помощи a SerializationBinder и переопределение BindToType метод, но я не нашел способа изменить имя класса в процессе сериализации. Действительно ли это возможно вообще??

Править:

Я обращаюсь к сериализации с помощью System.Runtime.Serialization, а не System.Xml.Serialization.

Спасибо!

8
задан Miguel Angelo 10 February 2010 в 13:22
поделиться

4 ответа

Я обнаружил, что могу использовать объект SerializationInfo, который появляется в функции GetObjectData, и изменить свойства AssemblyName и FullTypeName, чтобы при десериализации использовать SerializationBinder для сопоставления пользовательской сборки и имени типа обратно в действительный тип. Вот пример:

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);
6
ответ дан 5 December 2019 в 09:25
поделиться

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

10
ответ дан 5 December 2019 в 09:25
поделиться

Это можно сделать с помощью атрибутов:

[System.Xml.Serialization.XmlRoot("xmlName")]
public Class ClassName
{
}
2
ответ дан 5 December 2019 в 09:25
поделиться

Посмотрите на использование суррогатного + суррогатного селектора. Это вместе с привязкой к десериализации должно помочь.

0
ответ дан 5 December 2019 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: