【发布时间】:2014-07-05 12:23:13
【问题描述】:
我有一个这样的类型:
class Foo<T>
{
public string Text { get; set; }
public T Nested { get; set; }
public static string ToJson(Foo<T> foo) { [...] }
}
ToJson 将Foo<Bar> 实例序列化为 JSON,这是通过调整 JsConfig 无法实现的。另外ToJson依赖ServiceStack.Text序列化Nested,可以是Foo<Baz>的一个实例。
不幸的是,JsConfig 的实现方式意味着JsConfig<T> 将有一组静态变量用于Foo<Bar> 和其他Foo<Baz>。此外,AFAIK,ServiceStack.Text 无法为开放的泛型类型配置 JSON 序列化(例如:JsConfig.Add(typeof(Foo<>), config) 之类的东西)。我试图通过为Foo<T> 创建这个静态构造函数来解决这个问题:
static Foo() {
JsConfig<Foo<T>>.RawSerializeFn = ToJson;
}
这并不总是有效。这取决于运行时调用静态构造函数的顺序。显然,ServiceStack.Text 缓存了序列化程序函数,有时会在调用静态构造函数之前根据 API 中调用的顺序操作进行缓存,所以:
var outer = new Foo<Baz> { Text = "text" };
outer.ToJson(); // OK, because Nested is null
var inner = new Foo<Bar>();
inner.ToJson(); // OK, because JsConfig<Foo<Bar>>.RawSerializeFn is Foo<T>.ToJson
outer.Nested = inner;
outer.ToJson(); // NOT OK, because SS.Text uses the default serializer for Foo<T>, not Foo<T>.ToJson
我无法预先设置JsConfig<Foo<T>> 中的所有序列化程序,因为 T 几乎可以是任何类型,甚至是其他泛型类型。
是否可以在 ServiceStack.Text 中为开放的泛型类型(可以嵌套)定义自定义序列化例程?
【问题讨论】:
-
ServiceStack 的 G+ 组或 GitHub 问题是否比 StackOverflow 更适合提出这个问题?如果你这么认为,请告诉我。
标签: c# json generics serialization servicestack-text