десериализовать класс, чья сборка и пространство имен изменились - PullRequest
0 голосов
/ 01 марта 2012

У меня есть проблема, описанная здесь:

http://social.msdn.microsoft.com/Forums/en-AU/csharplanguage/thread/b310c71a-2479-4a93-888a-29294cecbe09

Они дают решение с использованием SerializationBinder.Есть ли другая альтернатива?Как украсить мои классы другим пространством имен и сборкой?Причина в том, что некоторые классы с этой проблемой использовались много раз, и я должен добавить строку «formatter.Binder = ...» в каждой части кода.Было бы проще применить мой гипотетический второй раствор.

Спасибо.

1 Ответ

0 голосов
/ 01 марта 2012

Если версия сборки изменяется, сериализованные объекты становятся недействительными.Однажды я внес изменения в исходный код Protobuf-Net , чтобы избежать проверки версии, и это было довольно легко сделать.Однако это может привести к неожиданным результатам (данные заканчиваются в неправильных полях), если вы не избегаете неявных полей и не устанавливаете индекс для каждого поля вручную, используя аннотации.Преимущество Protobuf-Net в том, что вы можете контролировать порядок полей в сериализованном потоке.

Другое решение заключается в использовании пользовательской сериализации ?Что-то вроде:

[Serializable]
public class MyObject : ISerializable 
{
  public int n1;
  public int n2;
  public String str;

  public MyObject()
  {
  }

  protected MyObject(SerializationInfo info, StreamingContext context)
  {
    n1 = info.GetInt32("i");
    n2 = info.GetInt32("j");
    str = info.GetString("k");
  }
[SecurityPermissionAttribute(SecurityAction.Demand, 
SerializationFormatter =true)]

public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
  {
    info.AddValue("i", n1);
    info.AddValue("j", n2);
    info.AddValue("k", str);
  }
}
...