Как десериализовать данные netdatacontractserializer в .net core?

У меня есть существующая служба WCF .NET Framework, которая возвращает данные, сериализованные с помощью NetDataContractSerializer, они используются различными клиентами .NET Framework.

Теперь я хочу написать новое клиентское приложение, которое также будет его использовать, но мой новый клиент будет написан на .NET Core.

Пакет совместимости Windows для .NET Core предоставляет большинство API-интерфейсов, необходимых для использования служб WCF, однако этот ключевой класс NetDataContractSerializer, похоже, отсутствует.

Есть ли способ десериализации этих данных в приложение .NET Core? Сами типы находятся в общей сборке .NET Framework, которая, как оказалось, совместима с .NET Standard, поэтому их можно без проблем загрузить в приложение .NET Core.

1
0
2 176
3

Ответы 3

Как вы знаете, класс NetdataContractSerializer не поддерживается DotnetCore. https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.netdatacontractserializer?view=netframework-4.7.2
DataContractSerializer поддерживается dotnetcore, и мы могли бы использовать метод ReadObject для чтения Stream и возврата десериализованного объекта.

Product p1 = (Product)serializer1.ReadObject(ms);

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.serialization.datacontractserializer?view=netcore-2.1
Для этих кроссплатформенных проектов я предлагаю вам использовать библиотеку NewtonSoft.Json, которая зависит только от стандарта .Net.
https://www.nuget.org/packages/Newtonsoft.Json/

Вы говорите, что DataContractSerializer может правильно десериализовать данные, которые были захвачены NetDataContractSerializer?

gallivantor 29.10.2018 03:09

да, я сделал тест, но я не предлагаю вам следовать ему.

Abraham Qian 29.10.2018 03:27

У меня это не работает, я получаю Element ClassName from namespace cannot have child contents to be deserialized as an object. Please use XmlNode[] to deserialize this pattern of XML при попытке десериализации с помощью DataContractSerializer

gallivantor 30.10.2018 02:05

Да, ты прав. Учитывая несовместимость платформы с сериализатором, я рекомендую вам использовать Newtonsoft.JSON.

Abraham Qian 02.11.2018 04:30

к сожалению, это попытка вызова существующей службы WCF, изменение способа сериализации данных на самом деле не вариант. Возможно, придется отказаться от .NET Core и вернуться к Framework, чтобы обойти это ...

gallivantor 02.11.2018 05:10

Да, я не могу с вами больше согласиться. Официальные лица описывают разницу (ссылка выше): NetDataContractSerializer отличается от DataContractSerializer одним важным способом: NetDataContractSerializer включает информацию о типе CLR в сериализованный XML, тогда как DataContractSerializer - нет. Следовательно, NetDataContractSerializer можно использовать только в том случае, если оба конца сериализации и десериализации используют одни и те же типы среды CLR.

Abraham Qian 02.11.2018 06:39

Похоже, что это невозможно, поэтому я открыл эту проблему в github .NET Core, чтобы отслеживать эту функцию:

https://github.com/dotnet/corefx/issues/33120

Хотя NetDataContractSerializer недоступен в .Net Core, вы можете попробовать этот порт Библиотека NetDataContractSerializer. Это почти полный порт .Net Core библиотеки .Net Framework System.Runtime.Serialization.

Если вы публикуете что-то, что сделали, вы должны упомянуть, что сделали это.

CodeCaster 29.08.2019 22:48

Другие вопросы по теме