Проблема с сериализацией миграции .NET Framework в .NET Core - PullRequest
0 голосов
/ 17 мая 2019

Я перенес несколько библиотек классов из .NET Framework 4.5 в .NET Standard 2.0.Использование этих библиотек из консольного приложения .NET Framework 4.8 работает нормально.Однако ссылка на библиотеки из консольного приложения .NET Core 2.2 приводит к следующему исключению:

SerializationException: Type 'System.Collections.Hashtable+SyncHashtable' in Assembly 'System.Runtime.Extensions, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' is not marked as serializable

с трассировкой стека

   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.CheckSerializable(Type t)
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObject(ParseRecord pr)
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord pr)
   at System.Runtime.Serialization.Formatters.Binary.BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
   at System.Runtime.Serialization.Formatters.Binary.BinaryParser.Run()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(BinaryParser serParser, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, Boolean check)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)

Мой самый внутренний вызывающий код для платформы, которая не работаетэто:

public static object Deserialize(BinaryReader binaryReader)
{
    BinaryReader binaryReader = new BinaryReader(inStream);
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    return binaryFormatter.Deserialize(binaryReader.BaseStream);
}

Есть идеи?

1 Ответ

0 голосов
/ 18 мая 2019

Ответ от Microsoft: «В .NET Core меньше типов можно сериализировать в двоичном формате, чем в .NET Framework.Это сделано из-за того, что сериализация, основанная на BinaryFormatter, исторически хрупка и подвержена проблемам с безопасностью.SyncHashtable в настоящее время не сериализуем.Однако, вероятно, мы должны сделать это так.Между тем вам нужно избегать сериализации.Это может означать использование Hashtable и ручную блокировку вместо использования SyncHashtable.Или, возможно (продвинутый), используя механизмы расширения BinaryFormatter, чтобы обойти проблему ».

Разговор на GitHub здесь: https://github.com/dotnet/corefx/issues/37708#issuecomment-493641762

...