【发布时间】:2016-01-06 07:27:28
【问题描述】:
我正在使用 Json.NET 序列化对象(命令)并通过服务总线发送它们。一些序列化对象变得太大而无法通过服务总线发送。我想用TooLargeForServiceBusAttribute 之类的自定义属性标记一些属性。现在我想在序列化的 json 中重命名这些属性并替换值。目标是将属性的大内容交换到外部存储中,并将外部存储中内容的 id 添加到序列化的 json 字符串中。
示例
class CommandWithTooLargeProperty
{
[TooLargeForServiceBus]
public string SomeProperty { get; set; }
}
我希望序列化的json如下:
{
SomeProperty_EXTERNAL_STORE_ID = '10000000-2000-3000-4000-500000000000'
}
我怎样才能挂钩到 Json.NET 的序列化过程来得到我想要的?我不能使用自定义转换器,因为我的一些命令类已经用自定义转换器修饰,并且我描述的机制对于我正在序列化的每个类都必须是透明的。
我的第一个想法是编写一个继承自 JsonTextWriter 的类来重命名属性,但我不想重命名每个属性,而只想重命名用 TooLargeForServiceBusAttribute 和 JsonTextWriter 装饰的属性我没有访问权限到源对象的属性。
我必须将IExternalStore 之类的东西注入序列化管道中,以将交换后的属性的内容保存到外部存储中。
反序列化过程必须做与序列化相反的工作:从SomeProperty_EXTERNAL_STORE_ID 获取id,从IExternalStore 加载内容并将加载的值设置为反序列化对象的属性。
【问题讨论】:
-
如果您不更改属性名称,而是换出对象本身,这样做会容易得多(尽管仍然有些困难)。例如。创建像
{"SomeProperty" : { "$External_Store_Id" : "10000000-2000-3000-4000-500000000000" } }这样的 JSON
标签: json.net