Не удается найти исключение сборки при выполнении десериализации - PullRequest
2 голосов
/ 15 октября 2019

У моего приложения winforms есть пользовательский элемент управления, одно из его свойств "LayoutStream" имеет тип byte[] и является сериализуемым свойством. В настоящее время я перенес свое приложение из 4.6 framework в проект NetCore 3.0.

При запуске портированного проекта NetCore 3.0, я получаю ниже исключения, когда десериализуем данные из файла resx.

this.control1.LayoutStream = ((SerializableByteList)(resources.GetObject("control1.LayoutStream")));


    public SerializableByteList LayoutStream
    {
        get
        {
            return LayoutStream;
        }
        set
        {
            LayoutStream= value;
            if (value != null)
                this.stmLayout.Write(value.Bytes.ToArray(), 0, value.Bytes.ToArray().Length);
        }
    }

    [Serializable]
    public class SerializableByteList 
    {
        public SerializableByteList()
        {
            Bytes = new List<byte>();
        }
        public List<byte> Bytes { get; set; }
    }

Возникает исключение: System.Runtime.Serialization. Исключение SerializationException в System.Runtime.Serialization.Formatters.dll В System.Runtime.Serialization.Formatters.dll возникло необработанное исключение типа System.Runtime.Serialization.SerializationException. Не удалось найти сборку. Mscorlib, Version = 4.0.0.0,Культура = нейтральная, PublicKeyToken = b77a5c561934e089]], mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089 '

Пожалуйста, предложите решение для решения этой проблемы.

1 Ответ

2 голосов
/ 15 октября 2019

По существу, BinaryFormatter не является переносимым ; был разработан для удаленного взаимодействия между двумя узлами, выполняющими идентичный код, а не для сохранения данных между платформами. Итак: мой основной совет прост:

Не используйте BinaryFormatter. Когда-либо.

Я понимаю, что эта лодка, возможно, отплыла, но очень прагматичный вариант:

  • выбрать новый сериализатор - убедиться, что он переносной (json, xml), protobuf и т. д.);примерно всего, кроме BinaryFormatter
  • в вашем старом коде, десериализовать данные с вашим текущим кодом и сериализовать их отдельно с новым выбором сериализатора
  • в вашемновый код, десериализовать его только в новом формате

При push , однако, вы можете попробовать поиграть с пользовательским SerializationBinder;Идея в том, что вы создаете подкласс SerializationBinder, переопределяете методы и сообщаете ему, где что-то найти. Основная проблема здесь заключается в том, что:

  1. сборки (mscorlib и т. Д.) Изменили идентичность
  2. типы перемещаются между сборками во многих случаях

Обе эти проблемы требуют решения.

Частичный код:

var bf = new BinaryFormatter { Binder = MyBinder.Instance };
// etc

с

class MyBinder : SerializationBinder
{
    private MyBinder() { }
    public static MyBinder Instance { get; } = new MyBinder();
    public override Type BindToType(string assemblyName, string typeName)
    {
        // TODO: check assemblyName and typeName against some known list, and
        // return the Type that should be used, often *instead of* the
        // one it expected;
    }
    public override void BindToName(Type serializedType,
        out string assemblyName, out string typeName)
    {
        //TODO: the opposite
    }
}

Но это тяжелая работа, и нелепо хрупкие. Ваше время было бы намного лучше потрачено на портирование на другой сериализатор, IMO. С удовольствием порекомендую некоторые из них, в зависимости от ваших потребностей.


Примечание: они неоднократно пытались убить BinaryFormatter для .NET Core, но, к сожалению, выжили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...