如何序列化/反序列化数据集以保留其元数据,从 .NET Framework 4.7.2 中的客户端应用程序发送到 Core 3.1 中的 gRPC 服务

问题描述

要求是将使用数据集的 WCF 服务迁移到 gRPC 服务,在将数据从客户端发送到服务时保留元数据以识别行修改,以便我们可以相应地更新数据库。

我正在处理序列化 DataSet 的 PoC,如下所示:

using (MemoryStream ms = new MemoryStream()) {
      dataSet.RemotingFormat = SerializationFormat.Binary;
      BinaryFormatter fmt = new BinaryFormatter();
      fmt.Binder = DataSetSerializationBinder.Default;
      fmt.Serialize(ms,dataSet);
      ms.Flush();
      return ms.ToArray();
}

将字节数组从客户端发送到服务,然后在服务中使用以下内容进行反序列化:

using (MemoryStream ms = new MemoryStream(datasetBytes)) {
      ms.Position = 0;
      BinaryFormatter fmt = new BinaryFormatter();
      fmt.Binder = DataSetSerializationBinder.Default;                    
      var des = fmt.Deserialize(ms);
      DataSet ds = (DataSet)des;
      ms.Close();
}

像这样覆盖 SerializationBinder:

public override Type BindToType(string assemblyName,string typeName){
    if (assemblyName.Equals("DSSerializer"))
        return typeof(System.Data.DataSet);
    else
        return defaultBinder.BindToType(assemblyName,typeName);
}
public override void BindToName(Type serializedType,out string assemblyName,out string typeName)
{
    assemblyName = "DSSerializer";
    typeName = serializedType.FullName;            
}

Serialize 和 Deserialize 方法在客户端和服务器引用的同一个库中, 但是当尝试反序列化时,它会抛出异常:未找到成员“XmlSchema”。 在添加 SerializationBinder 之前,异常是:BinaryFormatter.Deserialize: specified cast is not valid.

请注意,我需要传输架构信息和 DataRow.RowState 信息。当我尝试使用 this answer 所示的 XML 传输我的数据集到 Loading a datatable into a xml and xml back into a datatable 时:

dataSet.WriteXml(ms,XmlWriteMode.WriteSchema);

var dataSet = new DataSet();
dataSet.ReadXml(ms,XmlReadMode.ReadSchema);

我发现后者似乎没有被转移。这得到了 Preserving DataRowState when serializing DataSet using DataContractSerializer 的确认。

我知道 BinaryFormatter 不是最好的选择,什么是更好的方法,或者有什么方法可以让它工作?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)