【发布时间】:2018-11-26 12:28:59
【问题描述】:
我有一组包含字段和属性的对象,这些字段和属性需要在序列化的输出中进行检查,但在反序列化时不会读回。
这纯粹是为了调试/确认目的。我们正在创建数百个文件,我想通过添加补充信息来抽查序列化是否正确发生。我不希望在反序列化过程中读入这些补充信息——事实上这是不可能的。
我还需要在不同的序列化格式中使用相同的工具来执行此操作,以便我们可以评估哪一种效果最好。我有一种通用的序列化方法,其中所需的格式作为参数传入,因此对于每种不同的格式,不要太杂乱或复杂。
我四处寻找并发现了有关相关主题的各种内容 - 主要与相反的内容有关:在序列化期间不编写某些字段。外面的东西似乎很复杂,有时也很老套。
Is it possible to serialize an object differently to deserializing it using Json.Net?
JsonConvert .NET Serialize/Deserialize Read Only
Serialize Property, but Do Not Deserialize Property in Json.Net
此外,序列化格式之间的任何方法似乎都不一致。即,与 [*Ignore] 属性不同,没有 [*SerializeOnly] 属性(其中 * = JSON、XML、YAML)。
有没有一种简单的方法可以跨这些序列化格式执行此操作?是否有一个单一的属性系列可以提供帮助?还是在每种情况下都是特殊的和 hacky?
【问题讨论】:
-
这个答案似乎很温暖。这种方法是否普遍适用? stackoverflow.com/a/31732029 我问的原因是我发现 YAML 反序列化可以在 get-only 属性上抛出错误,因为它希望找到一个 setter。 YAML 是这里真正的兴趣所在,因为这是我们最终想要的格式,但我们确实需要 XML 和 JSON 在必要时可用。
-
考虑使用具有完全相同的字段和属性但属性不同的两种不同类型来启用/禁用序列化(甚至添加单元测试以确保它们 100% 匹配)。在两者之间添加隐式转换运算符。使用与您想要的特定序列化类型匹配的适当类型。
-
有两种不同的类型,正如@mjwills 建议的那样,但不要在您不想反序列化所有数据的类型上包含字段/属性。这些字段/属性的数据将被忽略,不需要属性。 SRP 适用于模型和服务一样。
-
然后将调试信息放入xml cmets中。
标签: c# json xml serialization yaml