首页 > 解决方案 > C# 使用 Net Standard 2.0 库发布到 nuget 时保留 [Serializable] 属性

问题描述

我有一个类库,其中有一个标记为 [Serializable] 的类。如果我直接引用项目,我可以使用 BinaryFormatter 序列化类:

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

但是,如果我通过 nuget 发布类库,它会丢失 [Serializable] 属性,并且无法再使用 BinaryFormatter 将其转换为字节数组。

创建 .nupkg 时,有没有办法按原样保留类?目前,我只是在构建时使用 Visual Studios Generate Nuget Package。

经过进一步调查,让我澄清一下我的发现。

*如果您有 .net472 Web API 和 .net472 类库,并且您通过 nuget 发布类库,一切正常。我已经使用 BinaryFormatter 序列化了一个标有 [Serializable] 属性的对象,并将其成功发送到服务器并能够对其进行反序列化。

*如果您有一个 .netstandard 2.0 库,并且您将其发布到 .netstandard 控制台项目并尝试使用 binaryformatter 对其进行序列化,您会得到该类未标记为可序列化(即使已标记)。

*如果您有一个 .net472 库并将其发布到 netstandard 2.0 控制台应用程序,我无法序列化该类,但由于其他原因,如果我收到错误:

在程序集“System.Private.CoreLib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e”中键入“System.Text.Encoding”未标记为可序列化。

简而言之,如果您真的需要二进制序列化,我不知道任何其他选择,但客户端和服务器都支持完整的框架库而不是核心/网络标准。

标签: c#serializationnuget.net-standard-2.0

解决方案


因为 .NET Standard没有定义一个类型是否是 serializable,所以我怀疑 NuGet在您以 .NET Standard 为目标时会故意去除该属性。

充其量,它看起来像 NuGet 保留了 .NET Standard 的(咳咳)标准,但在最坏的情况下,它默默地做着你可能没想到的事情——剥离 .NET Standard [Serializable]

所以,有点猜想,似乎编译器并不关心剥离属性或警告它不应该被应用(可能是因为在多目标场景中,[Serializable]在某些情况下是允许的),但 NuGet 是很多在您的情况下更严格,因为您只针对 .NET Standard。

似乎您可以提供一些运行时支持来确定该类型是否可序列化,但您不能在编译时执行此操作。可能保留该属性的唯一方法是将您的库定位到 .NET Core 或 .NET Framework。


推荐阅读