在 c 的服务器项目中序列化并在客户端项目中反序列化时的问题#

Issue while Serialized in server project and deserialized in client project in c#

提问人:Android Guy 提问时间:8/8/2023 最后编辑:dbcAndroid Guy 更新时间:8/8/2023 访问量:31

问:

我正在托管 API,客户端将由其他人构建并使用我的 API。 但是在测试时,我在客户端项目中反序列化时出现以下异常。

System.Runtime.Serialization.SerializationException:找不到程序集“网关,版本 = 1.0.0.0,区域性 = 中性,PublicKeyToken=null”

我想在 API 中给出响应时传递加密对象。因此,首先我对其进行序列化,然后进行加密。因此,在绝望的同时,我得到了错误。 服务器上的代码

BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream ms = new MemoryStream())
{
    formatter.Serialize(ms, obj);
    return ms.ToArray();
}
    
C# asp.net 序列化 tostring binaryformatter

评论

0赞 Orifjon 8/8/2023
您是否在客户端引用项目?'Gateway
2赞 Flydog57 8/8/2023
由于您正在使用 您可能需要阅读 learn.microsoft.com/en-us/dotnet/core/compatibility/...。特别是“BinaryFormatter、Formatter 和 IFormatter 上的 Serialize 和 Deserialize 方法现已作为警告过时。此外,默认情况下,ASP.NET 应用程序禁止 BinaryFormatter 序列化”。这是“由于 BinaryFormatter 中的安全漏洞”BinaryFormatter

答:

0赞 JonasH 8/8/2023 #1

请不要使用 BinaryFormatter,它几乎在各个方面都很糟糕。它缓慢、不安全和不灵活。并且由于上述原因也过时了。

我对 BinaryFormtter 的理解是,它基本上只是将对象的内存表示转储到文件中。这意味着任何更改此表示形式的内容都将中断序列化。包括

  • 对类名或命名空间的更改
  • 对 .Net 版本的更改(不是每个版本,但可以并且已经发生)
  • 任何属性的添加或删除。

您的错误很可能表明在客户端上找不到序列化的类。仅仅将类定义复制到客户端项目(就像使用大多数序列化库一样)是不够的。您至少需要确保命名空间完全匹配,并且仅引用用于序列化的完全相同的 dll 可能会更容易。Gateway

但请改用理智的序列化程序。Json 是最受欢迎的替代方案,如果您担心空间,可能会与压缩结合使用。如果你想要二进制序列化,protobuf .net 是一个不错的选择。但是还有很多可供选择,这些只是我最有经验的。