问题描述
要求是将使用数据集的 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 (将#修改为@)