- Почему DLL-библиотека. NET Framework содержит класс EthernetCatalog, даже используя класс IPAddress из. NET Core?
Это не так , . NET имеет функцию пересылки типов, которая позволяет разрешать типы с их унаследованными. Не стесняйтесь проверять сборки ядра. NET (путь примерно такой же, как C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.0.0
), вы найдете System.dll
даже в. NET ядре (где IPAddress
находился в. NET Framework). Но попробуйте разобрать его, и вы увидите, что он не содержит никаких типов, но содержит набор атрибутов сборки. Среди прочего:
[assembly: TypeForwardedTo(typeof(IPAddress))]
, где IPAddress
указывает на новое место типа в сборке System.Net.Primitives
. Вот почему вы получаете сообщение об ошибке для новой личности.
Не используется ли атрибут [System.Serializable] в. NET Core?
Да, но многие классы, которые были сериализуемы в. NET Framework больше не сериализуются в. NET Ядро (делегаты, типы, члены отражения, потоки, кодирование, культура) info, et c.). Как ни странно, механизм пересылки типов должен поддерживать сериализацию, в частности механизмы BinaryFormatter
, но, похоже, есть некоторые типы, которые больше не сериализуются, и они все еще пересылаются.
Возможные решения:
Как правило, если вам нужно сериализовать объекты на разных платформах, вы должны предпочесть некоторую текстовую сериализацию, такую как XML или JSON.
Но даже если вам действительно нужно для десериализации унаследованного потока с помощью BinaryFormatter
возможны некоторые обходные пути.
- Установите свойство
SurrogateSelector
BinaryFormatter
, чтобы настроить десериализацию некоторых типов. Возможно, самое простое решение, если вы используете мой CustomSerializerSurrogateSelector , который предназначен именно для этой цели. Из документации:
// deserializing a MemoryStream in .NET Core that was serialized in .NET Framework
var formatter = new BinaryFormatter { SurrogateSelector = new CustomSerializerSurrogateSelector() };
var memoryStream = (MemoryStream)formatter.Deserialize(streamSerializedInNetFramework);
Как вы видите, я использовал его для MemoryStream
, но он должен работать так же и для IPAddress
. Вы можете скачать библиотеку с nuget
Другое решение заключается в использовании
SerializationBinder
, который должен быть присвоен свойству
Binder
двоичного форматера: перенаправьте
IPAddress
в настраиваемый сериализуемый класс, который должен реализовывать
IObjectReference
. Вы должны реализовать метод
GetRealObject
, который должен возвращать правильный экземпляр
IPAddress
.