【问题标题】:C# Keep [Serializable] attribute when publishing to nuget with Net Standard 2.0 libraryC# 使用 Net Standard 2.0 库发布到 nuget 时保留 [Serializable] 属性
【发布时间】:2019-11-07 01:35:07
【问题描述】:

我有一个类库,其中有一个标记为 [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”未标记为可序列化。”

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

【问题讨论】:

  • 浏览this。看起来您可能会遇到问题。
  • 谢谢,有机会我会看看,但看起来不错。
  • 查看此问题后问题仍然存在。 .NetCore 确实支持您发送的链接帖子所讨论的可序列化属性 - 它刚刚被删除并放入单独的包中。问题是,为什么 nuget 会删除 .net core 允许的序列化? (单独的问题。)
  • 刚刚创建了一个 .net472 项目。添加了一个带有序列化的类并使用 nuget.exe 发布。它去除了序列化属性。有什么方法可以告诉 nuget 不要剥离它们?

标签: c# serialization nuget .net-standard-2.0


【解决方案1】:

因为 .NET Standard does not define whether a type is serializable,我怀疑 NuGet 在您以 .NET Standard 为目标时会故意去除属性。

在最好的情况下,NuGet 看起来像是在保留 .NET Standard 的(咳咳)标准,但在最坏的情况下,它正在默默地做一些你可能没有想到的事情——剥离 [Serializable]

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

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

【讨论】:

  • 澄清一下,net472 和 netstandard 2.0 下的 nuget 发布的类看起来都像是删除了可序列化属性。但是,如果我在 net472 类上使用二进制格式化程序,我可以对其进行序列化。不过,我只是在查看元数据程序集参考,所以它可能在完整的 net472 nuget 包中正确标记。
猜你喜欢
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多