3

是否有任何额外的配置需要让 ServiceStack 将 JSON 请求反序列化为适当的动态对象?我已经编译了包含 DynamicJson 类的 ServiceStack.Text 库的 Net40 版本,并将其添加到我的项目中。我有一个标准的请求和响应 DTO。请求 DTO 具有动态 (ExpandoObject) 公共属性。一旦进入我的服务操作,动态属性似乎没有正确序列化。在客户端,JSON 被完美地反序列化。

这是我正在使用的内容:

请求、响应和服务

[Route( "/foo/subscriptions", "POST")]
[DataContract( Name = "UpdateSubscription")]
public class UpdateSubscriptionMessage 
    : IReturn<UpdateSubscriptionMessageResponse>
{
    dynamic _subscription;

    public UpdateSubscriptionMessage() {
        _subscription = new ExpandoObject();
    }

    [DataMember( Name = "subscription" )]
    public dynamic Subscription { 
        get { return _subscription; } 
        set { _subscription = value; } 
    }
}

[DataContract( Name = "UpdateSubscriptionResponse")]
public class UpdateSubscriptionMessageResponse
{
    [DataMember( Name = "success" )]
    public bool Success { get; set; }

    [DataMember( Name = "subscriptionId" )]
    public int Id { get; set; }
}

public class SubscriptionTestService : BaseService
{
    private IAdminComponent _adminComponent;

    public SubscriptionTestService() : this (null) { }

    public SubscriptionTestService(IAdminComponent adminComponent) {
        _adminComponent = adminComponent;
    }

    public UpdateSubscriptionMessageResponse Post( UpdateSubscriptionMessage request)
    {
        var response = new UpdateSubscriptionMessageResponse();

        dynamic subscription = request.Subscription;

        return response;
    }
}

JSON POST 正文

{ 
  "subscription": 
  { 
    "name":"foo subscription title", 
    "description":"the description" 
  }
}

在发布 JSON 并进入我的服务操作后,快速查看请求会显示dynamic Subscription为字符串。ServiceStack 可以将 JSON 请求序列化为dynamic?

查看 request.Subscription 展示台 QuickWatch 确认类型是字符串

4

1 回答 1

2

你可能已经看到了这个公告:

下一个主要的 v4.0 也将是一个“突破性发布”,新功能受“AGPL/FOSS 许可例外”保护,并包括随着时间的推移而积累的一些突破性变化,包括升级所有项目(到 . NET 4+)、主要代码和 NuGet 包重构、清理和删除不推荐使用的代码、更好地一致性/简化一些概念以及实现一些我一直想添加但从未有时间的路线图功能。修复和发布将继续到 v3.x 并在单独的 v3 分支中维护,直到 v4.0 推出 beta 版。

由于没有理由在不支持 .Net4.0 的当前 3.x 分支中修复动态对象支持,因此答案是“不,ServiceStack 无法将 JSON 请求序列化为动态对象。”

您可以随时 fork 代码并在 ">= .Net4.0 only" 分支中添加缺少的支持。带有该修复的拉取请求可能不会被 3.x 核心接受,但可能会在即将到来的 v4.0 版本中受到欢迎。

或者,ServiceStack 的 JSON 序列化器中有自定义序列化函数的钩子,JsConfig<T>.RawSerializeFn并且JsConfig<T>.RawDeserializeFn. 结合this answer on serializing ExpandoObjects in .Net 4.0,这将允许您添加ExpandoObject 序列化支持而无需“修复”核心代码。

于 2013-09-13T17:09:08.450 回答