Я использую метод сериализации/десериализации. Класс BinaryFormatter. Каждый раз, когда создается новая сборка, BinaryFormatter не может десериализовать двоичные данные, даже если структура классов одинакова, но версия сборки отличается. Можно ли десериализовать двоичный буфер без проверки версии сборки, если структура классов остается неизменной?Монтаж Независимая сериализация в .NET
ответ
Попробуйте это:
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));
}
}
Спасибо, это именно то, что мне нужно.
Независимо от того, делает ли десериализационную сборку независимой? –
@Kirk Robb В двоичном форматировании хранится информация о типе в сериализованном объекте, чтобы он знал, к какому типу десериализовать его. Наследуя класс SerializationBinder, можно перенаправить все запросы для типов из двоичного форматирования на типы, содержащиеся в текущей сборке. Дайте мне знать, если это сработает. –
Возможно, использование другой техники сериализации лучше, как сказал Марк Гравелл. Однако ты просто спас мне жизнь. Я использую его в двоичном сокетном соединении, которое очень приятно делать с BinaryFormatter. Спасибо! – Vinzenz
Я думаю, что это проблема с ноу BinaryFormatter - here является возможным решением вы можете контролировать, какой тип загрузки с SerializationBinder - ссылка содержит код и пример того, как использовать это (почти во всех .net languagues)
Спасибо за ответ. Это круто. Существует один «но» - в моем случае структура классов одинакова, сборка отличается, даже версия сборки одинакова, но BinaryFormatter проверяет все детали, такие как «Дата создания файла». И это делает Deserialization отмененным. –
Правильный ответ !!!! Большой! помог мне. – Raymond
Это связано с BinaryFormatter
. Там есть некоторые продвинутые вещи, которые вы можете сделать, чтобы обойти его (с суррогатами и т. Д.), Но это непросто и я честно не рекомендую.
I настоятельно предлагаю вам ознакомиться с договором - сериализатором; например:
XmlSerializer
DataContractSerializer
(но неNetDataContractSerializer
)- Protobuf внутрисетевые
(я склоняюсь к последней, так как она дает гораздо более эффективный выход , и преднамеренно избегает некоторых вопросов, связанных с версией)
Во всех этих случаях хранилище данных не содержит (по крайней мере, с настройками по умолчанию) любое знание типов, за исключением договора, подразумеваемого именами или как указано (обычно в атрибутах).
Вы можете переместить класс для десериализации в отдельную сборку? видимо, это не меняется? – mtijn
да, могу. Я ищу способ пропустить проверку версии сборки и сохранить ее на свой страх и риск. –
Посмотрите на мою ссылку – Carsten