文本:将数据集序列化为json

本文关键字:json 序列化 数据集 文本 | 更新日期: 2023-09-27 18:26:21

我在使用ServiceStack.Text(来自Nuget.org)将数据集序列化为json时遇到问题。我使用的是最新的稳定版本4.0.50VS 2015。我一直收到

由于StackOverflowException ,进程终止

我的代码:

using System;
using System.Data;
using System.Data.SqlClient;
using ServiceStack.Text;
namespace TestServiceStackText
{
    class Program
    {
        static void Main(string[] args)
        {
            string ConnectionString = @"Server=MyServer; Database=NORTHWND; User Id=SomeUser; Password=SomePassword;";
            string SqlQuery = @"SELECT TOP 1 * FROM [NORTHWND].[dbo].[Customers]";
            // Create new dataset instance
            DataSet dataset = new DataSet();
            // Fill it with a little data: 1 table, 1 row
            using (var conn = new SqlConnection())
            {
                using (var da = new SqlDataAdapter())
                {
                    using (da.SelectCommand = conn.CreateCommand())
                    {
                        da.SelectCommand.CommandText = SqlQuery;
                        da.SelectCommand.Connection.ConnectionString = ConnectionString;
                        da.Fill(dataset);
                    }
                }
            }
            // Serialize to json: exception occurs here
            string json = TypeSerializer.SerializeToString<DataSet>(dataset);
            Console.WriteLine("Dataset serialized to json:'n {0}", json); 
            // Deserialize to DataSet
            DataSet ds = TypeSerializer.DeserializeFromString<DataSet>(json);
            Console.WriteLine("Name: {0}, Nr. of Tables: {1}", ds.DataSetName, ds.Tables.Count);
        }
    }
}

有人建议吗?

文本:将数据集序列化为json

ServiceStack的文本序列化程序都不明确支持DataSet,因为DataSet是一种糟糕的序列化类型。

像OrmLite这样的Micro ORM最终会更干净、更容易使用,哪些映射可以清洁POCO,这些映射非常适合序列化,例如,上面查询的等效代码是:

var customers = Db.Select<Customer>(q => q.Take(1));
var json = customers.ToJson();
var dto = json.FromJson<Customer>();

或者,如果你不想创建客户类型,你可以使用OrmLite的动态API映射到丢失类型的对象列表:

var list = Db.Select<List<object>>(
   "SELECT TOP 1 * FROM [NORTHWND].[dbo].[Customers]");

或字典:

var dict = Db.Select<Dictionary<string,object>>(
   "SELECT TOP 1 * FROM [NORTHWND].[dbo].[Customers]");

有关使用OrmLite和AutoQuery查询northwind数据集的代码示例,请查看northwind.servicestack.net项目。

总之,如果使用干净的POCO而不是每个序列化程序都支持的数据集,则问题会小得多。数据集比数据集小得多,速度也快得多。您还可以使用ServiceStack将POCO或松散类型的Dictionary序列化为CSV。文本:

var csv = customers.ToCsv();
var csv = dict.ToCsv();