使用Net Standard 2.0库发布到nuget时,C#保持[可序列化]属性

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

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

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

创建.nupkg时,是否可以保留AS-IS类?目前,我只是在构建时使用Visual Studios Generate Nuget包。

进一步调查后,让我澄清一下发现。

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

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

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

程序集'System.Private.CoreLib,版本= 4.0.0.0,区域性=中性,PublicKeyToken = 7cec85d7bea7798e'中的类型'System.Text.Encoding'未标记为可序列化。'

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

qwweerrttyyuuiioop 回答:使用Net Standard 2.0库发布到nuget时,C#保持[可序列化]属性

由于.NET Standard does not define whether a type is serializable,我怀疑当您将.NET Standard作为目标时,NuGet故意剥夺了属性

充其量看来,NuGet保留了.NET Standard的(糟糕)标准,但最糟糕的是,它默默地做着您可能不会想到的事情—剥离[Serializable]

因此,有一点推测,似乎编译器不在意剥离属性或警告不应应用该属性(可能是因为在多目标方案中,某些情况下允许使用[Serializable]情况),但是NuGet在您的情况下要严格得多,因为您只针对.NET Standard。

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

本文链接:https://www.f2er.com/3148029.html

大家都在问