C # Сохранить атрибут [Serializable] при публикации в nuget с библиотекой Net Standard 2.0 - PullRequest
1 голос
/ 07 ноября 2019

У меня есть библиотека классов, класс которой помечен как [Сериализуемый]. Если я ссылаюсь на проект напрямую, я могу сериализовать класс с помощью BinaryFormatter:

 BinaryFormatter bf = new BinaryFormatter();
 MemoryStream ms = new MemoryStream();
 bf.Serialize(ms, obj);
 var data = ms.ToArray();

Однако, если я опубликую библиотеку классов через nuget, она теряет атрибут [Serializable] и больше не может быть преобразована вбайтовый массив с использованием BinaryFormatter.

Есть ли способ сохранить класс AS-IS при создании .nupkg? В настоящее время я просто использую Visual Studios Generate Nuget Package при сборке.

После дальнейшего изучения позвольте мне уточнить мои выводы.

* Если у вас есть .net472 WebAPI и библиотека классов .net472, и вы публикуете библиотеку классов через nuget, все работает. Я использовал BinaryFormatter для сериализации объекта, помеченного атрибутом [Serializable], его успешной отправки на сервер и возможности десериализации.

* Если у вас есть библиотека .netstandard 2.0, и вы публикуетеон выходит в консольный проект .netstandard и пытается сериализовать его с помощью бинарного форматера, который, как вы получите, не помечен как сериализуемый (даже если он помечен).

* Если у вас есть библиотека .net472, и вы публикуете ее в консольном приложении netstandard 2.0, я не смог сериализовать класс, но это произошло по другим причинам, в случае, если я получил ошибку:

Тип 'System.Text.Encoding' в сборке 'System.Private.CoreLib, версия = 4.0.0.0, Culture = нейтральный, PublicKeyToken = 7cec85d7bea7798e' не помечен как сериализуемый. '

ВКороче говоря, если вам действительно нужна двоичная сериализация, я не знаю ни одного другого варианта, кроме как для клиента и сервера для поддержки полной библиотеки фреймворка, а не ядра / netstandard.

1 Ответ

1 голос
/ 08 ноября 2019

Поскольку .NET Standard не определяет, является ли тип сериализуемым , я подозреваю, что NuGet удаляет атрибут с целью , когда вы выбираете .NET Standard.

В лучшем случае похоже, что NuGet сохраняет (кхм) стандарты .NET Standard, но в худшем случае он молча делает что-то, чего вы не можете ожидать - убирая [Serializable].

Таким образом, с некоторой гипотезой кажется, что компилятор не хочет удалять атрибут или предупреждать о том, что он не должен применяться (возможно, потому что в сценарии с множественным таргетингом [Serializable] разрешен вв некоторых ситуациях), но NuGet в вашем случае намного строже, потому что вы нацеливаетесь только на .NET Standard.

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

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