Измените автоматически реализованные свойства на обычные и десериализацию с помощью 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
и особый случай это поле.