1

我正在使用 protobuf 序列化数据集并将其从 WCF 服务发送到 winfom 客户端。

我在这里面临两个问题......

  1. DataSet 来自 DB,它包含一个 system.Object 类型的列,protobuf 无法处理并抛出异常...

    无法序列化“System.Object”类型的数据列。仅支持以下列类型:Boolean、Byte、Byte[]、Char、Char[]、DateTime、Decimal、Double、Guid、Int16、Int32、Int64、Single、String。"}

数据集序列化代码

using (var ms = new MemoryStream())
                    {
                        if (ReportData.Tables.Count > 0)
                        {
                            DataSerializer.Serialize(ms, ReportData);
                           }
                    }

如何强制 protobuf 序列化 system.Object 数据类型列。我尝试将此 system.Object 类型列转换为字符串然后序列化...在这种情况下一切正常,但这是一个耗时的过程,因为我需要克隆表并导入所有行(我的数据集包含数百万行)。

 DataTable dtCloned = ReportData.Tables[0].Clone();
                    foreach (DataColumn column in dtCloned.Columns)
                    {
                        if (column.DataType == typeof(System.Object))
                            objectColumns.Add(column);
                    }
                    if (objectColumns.Count > 0)
                    {
                        foreach (DataColumn column in objectColumns)
                        {
                            column.DataType = typeof(System.String);
                        }
                    }
                    try
                    {
                        foreach (DataRow row in ReportData.Tables[0].Rows)
                        {
                            dtCloned.ImportRow(row);
                        }
                    }
                    catch (Exception ex)
                    {

                    }

这是我为此编写的示例代码。此 System.Object 的 DB 类型是 SQL_Variant,我们无法更改它,因为这是旧版 SP,并且该列包含不同类型的数据(十进制、int varchar)。

有没有更好的方法来实现同样的目标。

  1. 当这个序列化失败并抛出错误时......在客户端我得到了通信异常,其中不知道出了什么问题。它唯一说的是......

    “在可靠会话完全完成之前,底层安全会话出现故障。可靠会话出现故障。”

我尝试在 WCF 服务端设置以下内容,但没有用...

 <serviceDebug includeExceptionDetailInFaults="true" />

还尝试通过 FaultException... 不走运

如何将正确的异常和信息从 WCF 服务传递给我的客户。

提前致谢。

4

1 回答 1

1

最终,protobuf-net 对object. 它也不附带对DataTable. 坦率地说,我会挑战DataTable用作交换类型的适用性,更喜欢类型良好的 DTO。

如果您DataTable出于某种原因必须使用,我想知道您最好的选择是否是单独序列化,确保使用二进制格式(请参阅RemotingFormat)并写入 a MemoryStream,然后取出字节(ToArray在这种情况下)并将 WCF 交给byte[]. 在另一端反转。

于 2018-01-19T07:48:35.260 回答