如何用单一序列化工具处理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
相关产品推荐
相关产品推荐

