[Serialize]关键字的含义是什么?

问题描述 投票:0回答:1

昨天和前天,我在一条消息上浪费了相当长的时间,但没有收到。
一段时间后,我意识到这是由于其中一个类的开头缺少

[serialize]
标签造成的,该标签存在于该消息中:由于该标签不存在,该类无法序列化,因此该消息是未创建且显然未发送。

现在我想了想:这样的标签有什么意义呢?为什么 C# 语言(或一般的 .NET 技术)不简单地将所有类声明为可序列化?这会导致什么可能的缺点?

有些人想结束这个问题作为this的重复,但是这个问题解释了提到的标签的作用,但不是为什么它不是所有类的标准配置设置(因此“语言律师”标签这个问题)。

c# .net serialization tags language-lawyer
1个回答
0
投票

我认为在 StackOverflow 意义上可以回答的问题(尽管在 SoftwareEngineering.Stackexchange.com 上可能更好)是“自动将所有类声明为可序列化原因可能有什么缺点?”

有几个:

  1. 并非所有类都具有公共成员属性,这意味着序列化器实现必须决定默认序列化行为应该是什么。应该是“假装这个类不存在吗?”返回空值?字符串.空?突然我还需要一个属性来选择退出序列化。
  2. 这将要求序列化器始终应用默认策略来决定如何处理不太琐碎的场景,例如循环引用和一般的嵌套引用,否则当选择可序列化时,在琐碎的情况下可以忽略这些场景。请参阅如何在 System.Text.Json 中保留引用并处理或忽略循环引用
  3. 尽管即使选择加入,BinarySerializer 也已经存在安全问题,但如果默认情况下所有内容都是可序列化的,则可能会增加其他序列化器的攻击面。请参阅使用 BinaryFormatter 和相关类型的反序列化风险
  4. 添加任何像这样的默认行为都可能会产生巨大的实施成本,并带来许多难以预测的副作用,所以“什么都不做的成本是多少?”最终成为一个有用的问题。
© www.soinside.com 2019 - 2024. All rights reserved.