#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