You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单一序列化工具处理DataSet与OleDbParameter[]的序列化需求?

解决方案:使用Newtonsoft.Json并调整配置,同时支持DataSet与OleDbParameter[]序列化

可以通过Newtonsoft.Json结合自定义配置,同时解决DataSet循环引用和OleDbParameter[]序列化不完整的问题,无需同时使用多个序列化工具。

问题根源

Newtonsoft.Json默认对OleDbParameter序列化时,仅输出其ToString()返回的参数名称(因为OleDbParameter实现了ISerializable接口,默认序列化逻辑受此影响);而它本身原生支持DataSet的序列化,只需处理循环引用即可。

具体实现步骤

1. 配置序列化参数

通过调整JsonSerializerSettings,强制Newtonsoft.Json序列化OleDbParameter的所有公共属性,并处理DataSet的循环引用:

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Data.OleDb;

// 初始化序列化配置
var jsonSettings = new JsonSerializerSettings
{
    // 处理DataSet内部的循环引用
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
    // 忽略Serializable接口,强制序列化所有公共属性
    ContractResolver = new DefaultContractResolver
    {
        IgnoreSerializableInterface = true,
        IgnoreSerializableAttribute = true
    }
};

2. 序列化与反序列化示例

// 序列化OleDbParameter[]
var parameters = new OleDbParameter[]
{
    new OleDbParameter("XML", "<root></root>"),
    new OleDbParameter("TotalRecords", 50)
};
string serializedParams = JsonConvert.SerializeObject(parameters, jsonSettings);

// 反序列化OleDbParameter[]
var deserializedParams = JsonConvert.DeserializeObject<OleDbParameter[]>(serializedParams, jsonSettings);

// 序列化DataSet(假设已填充数据)
var dataSet = new DataSet();
// ...填充DataSet逻辑...
string serializedDataSet = JsonConvert.SerializeObject(dataSet, jsonSettings);

// 反序列化DataSet
var deserializedDataSet = JsonConvert.DeserializeObject<DataSet>(serializedDataSet, jsonSettings);

3. 可选:自定义转换器精简序列化内容

如果不需要序列化OleDbParameter的全部属性,可以自定义JsonConverter只保留核心字段(如ParameterName、Value、DbType等),减少JSON体积:

public class OleDbParameterConverter : JsonConverter<OleDbParameter>
{
    public override void WriteJson(JsonWriter writer, OleDbParameter value, JsonSerializer serializer)
    {
        writer.WriteStartObject();
        writer.WritePropertyName("ParameterName");
        serializer.Serialize(writer, value.ParameterName);
        writer.WritePropertyName("Value");
        serializer.Serialize(writer, value.Value);
        writer.WritePropertyName("DbType");
        serializer.Serialize(writer, value.DbType);
        writer.WritePropertyName("Direction");
        serializer.Serialize(writer, value.Direction);
        writer.WriteEndObject();
    }

    public override OleDbParameter ReadJson(JsonReader reader, Type objectType, OleDbParameter existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        var jsonObj = JObject.Load(reader);
        var param = new OleDbParameter
        {
            ParameterName = jsonObj["ParameterName"].ToString(),
            Value = jsonObj["Value"].ToObject<object>(serializer),
            DbType = jsonObj["DbType"].ToObject<DbType>(serializer),
            Direction = jsonObj["Direction"].ToObject<ParameterDirection>(serializer)
        };
        return param;
    }
}

将转换器加入配置即可生效:

jsonSettings.Converters.Add(new OleDbParameterConverter());

为什么不选其他工具?

  • System.Text.Json:对DataSet的序列化支持不完善,需要编写复杂的自定义转换器才能处理循环引用,且对OleDbParameter的序列化同样需要额外配置,成本更高。
  • System.Web.Script.Serialization:原生无法处理DataSet的循环引用问题,没有灵活的配置项解决该问题,扩展性不足。

内容的提问来源于stack exchange,提问作者DinahMoeHumm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:42:32