2011-08-22 7 views
8

Я использую метод сериализации/десериализации. Класс BinaryFormatter. Каждый раз, когда создается новая сборка, BinaryFormatter не может десериализовать двоичные данные, даже если структура классов одинакова, но версия сборки отличается. Можно ли десериализовать двоичный буфер без проверки версии сборки, если структура классов остается неизменной?Монтаж Независимая сериализация в .NET

+0

Вы можете переместить класс для десериализации в отдельную сборку? видимо, это не меняется? – mtijn

+0

да, могу. Я ищу способ пропустить проверку версии сборки и сохранить ее на свой страх и риск. –

+0

Посмотрите на мою ссылку – Carsten

ответ

7

Попробуйте это:

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     return Type.GetType(String.Format("{0}, {1}", typeName, Assembly.GetExecutingAssembly().FullName)); 
    } 
} 
formatter.Binder = new CurrentAssemblyDeserializationBinder(); 
formatter.Deserialize(inStream); 

Тема Poster Добавлено:

Да, это работает. Просто убедитесь, что существуют какие-либо типы System.Generic или других Libs в двоичных данных, тогда вы должны пройти их без изменений. «ResizableControls» - имя старой сборки lib, «EntityLib» - новое имя Ассамблеи. Кроме того, номер версии также должен быть заменен по требованию.

public sealed class CurrentAssemblyDeserializationBinder : SerializationBinder 
{ 
    public override Type BindToType(string assemblyName, string typeName) 
    { 
     string name; 
     if (assemblyName.Contains("ResizableControl")) 
     { 
      name = Assembly.GetAssembly(typeof(EntityLib.Pattern)).ToString(); 
     } 
     else 
     { 
      name = assemblyName; 
     } 
     return Type.GetType(String.Format("{0}, {1}", 
      typeName.Replace("ResizableControl", "EntityLib"), name)); 
    } 
} 

Спасибо, это именно то, что мне нужно.

+0

Независимо от того, делает ли десериализационную сборку независимой? –

+0

@Kirk Robb В двоичном форматировании хранится информация о типе в сериализованном объекте, чтобы он знал, к какому типу десериализовать его. Наследуя класс SerializationBinder, можно перенаправить все запросы для типов из двоичного форматирования на типы, содержащиеся в текущей сборке. Дайте мне знать, если это сработает. –

+0

Возможно, использование другой техники сериализации лучше, как сказал Марк Гравелл. Однако ты просто спас мне жизнь. Я использую его в двоичном сокетном соединении, которое очень приятно делать с BinaryFormatter. Спасибо! – Vinzenz

1

Я думаю, что это проблема с ноу BinaryFormatter - here является возможным решением вы можете контролировать, какой тип загрузки с SerializationBinder - ссылка содержит код и пример того, как использовать это (почти во всех .net languagues)

+0

Спасибо за ответ. Это круто. Существует один «но» - в моем случае структура классов одинакова, сборка отличается, даже версия сборки одинакова, но BinaryFormatter проверяет все детали, такие как «Дата создания файла». И это делает Deserialization отмененным. –

+0

Правильный ответ !!!! Большой! помог мне. – Raymond

6

Это связано с BinaryFormatter. Там есть некоторые продвинутые вещи, которые вы можете сделать, чтобы обойти его (с суррогатами и т. Д.), Но это непросто и я честно не рекомендую.

I настоятельно предлагаю вам ознакомиться с договором - сериализатором; например:

  • XmlSerializer
  • DataContractSerializer (но неNetDataContractSerializer)
  • Protobuf внутрисетевые

(я склоняюсь к последней, так как она дает гораздо более эффективный выход , и преднамеренно избегает некоторых вопросов, связанных с версией)

Во всех этих случаях хранилище данных не содержит (по крайней мере, с настройками по умолчанию) любое знание типов, за исключением договора, подразумеваемого именами или как указано (обычно в атрибутах).

+1

+1 для ptotobuf-net: новый для меня ... – Tigran

+0

@ Тигран Я могу говорить об этом в течение всего дня, p –

+0

Я могу сделать только один +1: P Но серьезно будет смотреть на него, вызывать Мне понадобилась сериализация раз назад ... спасибо! – Tigran

Смежные вопросы