Измените автоматически реализованные свойства на обычные и десериализацию с помощью BinaryFormatter

У меня есть объект со свойством, реализованным как

public String Bla {get;set;} 

После изменения реализации что-то вроде

private String _bla;

public String Bla
{
    get { return _bla; }
    set { _bla = value; } 
} 

при десериализации это имущество появляется пустым.

у меня есть много сериализованных данных из старой реализации, и я хотел бы загрузить их с новой реализацией

Есть ли способ, чтобы изменить implentation, чтобы быть совместимым со старыми двоичными файлами?

РЕДАКТИРОВАТЬ:

Некоторые люди могут столкнуться с той же проблемой, поэтому вот мое хакерское решение:

автоматически сгенерированные поля имеют недопустимое соглашение об именах: код C#:

[CompilerGenerated]
private string <MyField>k__BackingField;

[CompilerGenerated]
public void set_MyField(string value)
{
    this.<MyField>k__BackingField = value;
}

[CompilerGenerated]
public string get_MyField()
{
    return this.<MyField>k__BackingField;
}

быстрое и грязное решение для меня заключалось в создании частного вспомогательного поля под названием xMyFieldxK__BackingField в источнике,

и исправление сериализованных двоичных данных путем замены всех вхождений <MyField> с xMyFieldx до десериализации

2 ответа

Решение

Попробуйте реализовать ISerializable

    [SecurityCritical]
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        if (info == null)
            throw new ArgumentNullException("info");

        info.AddValue("name of compiler generated field", _bla);
    }

BinaryFormatter сериализует поля, а не свойства.

Вы могли бы заставить его работать, посмотрев, какое имя сгенерированного поля было в ILSpy или что-то подобное, и назвав свое имя таким образом.

В противном случае, как сказал Хенрик, вам придется написать собственную десериализацию, см. Этот вопрос для получения дополнительной информации.

Вы, вероятно, можете проверить информацию десериализации, выполнив ISerializable и особый случай это поле.

Другие вопросы по тегам