2013-01-11 54 views
4

我们正在从Json.NET切换到ServiceStack.Text,并且遇到了多态集合序列化的问题。使用ServiceStack.Text序列化多态集合

在JSON.NET我用来创建一个自定义JsonCreationConverter并重写Create()方法来选择我要创建的类型 - 概述的位置:

http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

有问题的集合List<ItemBase>其中可以包含FlightItemCarHireItem对象。

这是我的版本的Create()方法对JSON.NET:

protected override ItemBase Create(Type objectType, JObject jsonObject) 
     { 
      var itemType = jsonObject["Type"].ToString(); 
      switch (itemType) 
      { 
       case "flight": 
        return new FlightItem(); 
       case "carhire": 
        return new CarHireItem(); 
       default: 
        return null; 
      } 
     } 

那是可能的ServiceStack?

ServiceStack中的多态集合的序列化和反序列化工作,然而,它将对象类型附加到JSON输出,例如,

"__type" : "TestProject.Model.FlightItem, TestProject" 

这意味着我需要在发布JSON时提供的类型,我不具有.NET类型的API调用内的任何人都可见太热衷。

有什么建议吗?如果可以用不同的方式做到这一点,你能指点我一些例子吗?

回答

6

首先,Interfaces or abstract types in DTOs are a bad idea

您现在处于奇怪的位置,您尝试支持DTO中的多态类型,但不想提供JSON序列化程序特定的信息?你需要定制的代码来支持多态DTO的原因是因为根据线格式不可能知道应该使用什么具体类型,所以为什么ServiceStack会为此目的发出__type属性。

为了避免这些黑客入侵,并使其在所有JSON序列化器中同样适用,最好将您的多态类型“扁平化”为单个“扁平”DTO,然后通过电线发送。一旦你回到C#中,你可以使用代码将其投影到理想的类型中。

ServiceStack确实提供了一些JsConfig<ItemBase>.RawDeserializeFn,它可以让您执行类似操作,请参阅CustomSerializerTests for an example。还有JsConfig<ItemBase>.OnDeserializedFn挂钩可能会有所帮助,但它取决于ItemBase是否包含两种具体类型的完整属性列表。

+0

解决了这个问题 - 感谢您的帮助 –

相关问题