在 WCF 中序列化 .NET 数据表的最佳方法是什么?



当我将WCF配置为使用jSON序列化,并在我的一个DataContract中包含一个DataTable时,它会将DataTable序列化为XML,然后将整个DataContract序列化为jSON。我希望DataTable被序列化为jSON,而不是XML。

我的问题是:

  1. 为什么它首先将DataTable序列化为XML
  2. 如何将其序列化为jSON
  1. DataTable是一个纯.NET构造,不能(容易地)用JSON以无损方式表示。DataTables包含许多JSON无法存储的附加信息:主键、autoincs、允许null、标题、数据类型、索引等。序列化为XML/Binary是.NET本机序列化DataTable的唯一方法。然后将此XML序列化的DataTable序列化为JSON。

  2. 使用JSON.NET或FastJSON将DataTable转换为简单、干净的兼容JSON的DataTable版本,任何JSON客户端都可以使用该版本,而不仅仅是.NET WCF客户端。您将丢失上面(1)中提到的所有DataTable自定义属性,只获得字段名称/值JSON对。这种方式的存储效率很低,因为每一行都有重复的字段名。

不要在DataContract中使用DataTable。如果您想要DataTable的好处,并且您的客户端始终是.NET,请通过二进制序列化将DataTable序列化为字节数组,然后选择性地压缩结果序列化的字节流。在DataContract中公开一个字节数组。这将在客户端上为您提供高效、完全无损的DataTable版本(经过解压缩和二进制反序列化),而不是淡化的JSON版本的DataTable(如(2)所提供)。。。

试试这个:

public string ConvertDataTabletoString(System.Data.DataTable dt)
{
    System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
    Dictionary<string, object> row;
    foreach (System.Data.DataRow dr in dt.Rows)
    {
        row = new Dictionary<string, object>();
        foreach (System.Data.DataColumn col in dt.Columns)
        {
            row.Add(col.ColumnName, dr[col]);
        }
        rows.Add(row);
    }
    return serializer.Serialize(rows);
}

我遇到了同样的问题,我的wcf服务在将json从数据集转换为json时没有正确格式化json。我通过使用以下解决方案使其工作:

using System.ServiceModel.Channels;
using System.ServiceModel.Web;

dsData是我的数据集

string json = Newtonsoft.Json.JsonConvert.SerializeObject(dsData);
return WebOperationContext.Current.CreateTextResponse(json, "application/json;charset=utf-8", System.Text.Encoding.UTF8);

返回类型为"Message"。

根据其主页上的图表,Json.NET实际上是您唯一的选择-您可以从NuGet快速获得它。幸运的是,这是一个很棒的图书馆,而且很容易使用。

string json = JsonConvert.SerializeObject(myDataSet, new DataSetConverter());

请注意,Rich Strahl有一篇很棒的帖子,其中包含了更多的细节,为了进行比较,他还包括了一些使用JavaScriptSerializer和(相当广泛的)自定义转换器的自定义工作。

相关内容

  • 没有找到相关文章

最新更新