Исключения в списке десериализации в другой DLL

#c# #binaryformatter

#c# #двоичный форматировщик

Вопрос:

В унаследованном проекте при попытке десериализации общего списка в dll, отличной от dll, которая сериализовала список, я получаю исключения.

Общим в списке является следующий класс

 [Serializable]
    public class NodeData
    {
        public int EmployeeId { get; set; }
        public int? ManagerId { get; set; }
        public byte ImageIndex { get; set; }
        public int IDRx { get; set; }
  
    } 
 

Метод, который десериализует его

 public static T Deserialize <T> (string serializationFile)
{
    //T NodesData = new List<NodeData>();
    using (Stream stream = File.Open(serializationFile, FileMode.Open))
    {
        var bformatter = new BinaryFormatter
        {
            Binder = new NodeDataLoaderDeserializationBinder()
        };

        var result = bformatter.Deserialize(stream);


        T NodesData = (T)resu<
        return NodesData;
    }
    
}
 

Я также создал пользовательский SerializationBinder с помощью метода BindToType, реализованного таким образом

 public override Type BindToType(string assemblyName, string typeName)
{
    Type typeToDeserialize;

    var tn = typeof(List<NodeData>).AssemblyQualifiedName;
    typeToDeserialize = Type.GetType(tn, true);

    return typeToDeserialize;
}
 

То, что метод вернул мне, это исключение

  An object of type 'System.Collections.Generic.List`1 [Utility.NodeData] []' cannot be converted to type 'Utility.NodeData []'.
 

Если я изменю typeof в методе BindToType с помощью NodeData[], я получу:

  Reference to an object not set to an object instance.  
 

Как я должен реализовать свой метод BindToType?

Комментарии:

1. НЕ используйте BinaryFormatter ни по какой причине. Этот класс имеет неустранимые проблемы с безопасностью , устарел и помечен для удаления из .NET. Его функциональность уже удалена из .NET. То, что здесь произошло, является лишь одной из проблем, вызванных этим — малейшее различие в типах может нарушить десериализацию, потому BinaryFormatter что сериализует все , включая поля и имена типов.

2. Если вы хотите двоичную сериализацию, используйте один из многих доступных кроссплатформенных форматов, таких как буферы протокола, Avro, Parquet, Orc и т.д. Буферы протокола — хороший выбор, поскольку .NET уже поддерживает его через свой инструментарий gRPC или через библиотеки, такие как Protobut -net от StackExchange