我现在有个需求, 客户端有个comboBox,里面的数据从服务端返回。 我在服务端写个接口:[webInvoke(method ="Get",ResponseFormat= webMessageFormat.Json)]
  public stream ReturnContent()
{
  datatable dt = ...;
  return Serialize(dt);
}  private stream Serialize(object content)
{
    var ScriptSerializer = new JavaScriptSerializer();
            var serializeObject =  Encoding.UTF8.GetBytes(javaScriptSerializer.Serialize(content));
            var Stream = new MemoryStream(serializeObject);
            WebOperationContext.Current.OutgoingResponse.ContentType
                = "application/json; charset=utf-8";
            return Stream;
}Serialize这个方法是别人写好的,我想知道我能把里面的参数object类型传个dataTable进去,这个dataTable里肯定有数据,而且不止一行、一列。传个dataTable进去,用这个方法Serialize序列化之后,客户端解析会不会有问题?如果不行,我该怎么把这个table传给客户端?

解决方案 »

  1.   

    应该不会有问题。
    我这边用的是MemoryStream.
    客户端再转换一次就可以了。
      

  2.   

    我不知道客户端是怎样解析的,但是原来的服务端返回的就是stream, 客户端就可以解析。我只要保证Serialize方法接收dataTable参数后,可以正常的执行这个函数并能返回stream,这个stream其实就是memoryStream。顺便问一下,这个方法的Method属性应该是get不是post吧?
      

  3.   

    如果是.NET客户端,解析不会有问题,如果是Ajax访问,就会麻烦了,虽然能解析,但是DataTable是很复杂的结构,使用起来不方便。因此返回List<T>是最佳方案。
    至于Method用get还是post,都是可以的,只不过没有数据发送的情况下,get效率好点。
      

  4.   

    服务直接返回 datatable不行吗?
      

  5.   


    客户端是mobile,ipad之类的,我刚才试过了放dataTable进去不行,在执行到var serializeObject =  Encoding.UTF8.GetBytes(javaScriptSerializer.Serialize(content));抛异常:序列化类型为“System.Reflection.RuntimeModule”的对象时检测到循环引用,是不是只能序列化一行数据啊?
    能直接返回dataTable么?我要返回的数据是这样的:
    id   name
    1     tst1
    2     tst2
    ...
    大侠啊,这个dataTable要怎么返回到客户端?
      

  6.   

    直接把table数据转换成json格式的数据通过service传递到前端。
      

  7.   

    datatable太大,而且别的平台不认。建议可以用JSON传
      

  8.   

    你可以考虑使用DataContractJsonSerializer,但是必须在客户端构造类型,因为客户端不存在DataTable。
    DataTable内部存在循环引用,自然序列化和反序列化会出错,因此对于非.NET客户端(你这里就不是),不要用该类型存储数据,使用List<T>,自己构造实体类对象,如果实体类懒得构造,用List<Dictionary<string,object>>作为返回值也可以,替代DataTable