protobuf 和 WCF 的序列化问题

Serialization issue with protobuf and WCF

我正在使用 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 类型的列转换为字符串然后序列化...在这种情况下一切正常,但这是一个耗时的过程,因为我需要克隆 table 并导入所有行(我的数据集包含数百万行)。

 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 的数据库类型是 SQL_Variant,我们无法更改它,因为这是旧版 SP,并且该列包含不同类型的数据(十进制,int varchar)。

有没有更好的方法来达到同样的效果。

  1. 当此序列化失败并抛出错误时...在客户端,我收到通信异常,其中不包含任何线索 wrong.The 它唯一说的是...

    "The underlying secure session has faulted before the reliable session fully completed. The reliable session was faulted."

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

 <serviceDebug includeExceptionDetailInFaults="true" />

还尝试传递 FaultException... 运气不好

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

提前致谢。

最终,protobuf-net 对 object 提出了一些非常基本的反对意见。它也不附带对 DataTable 的预建支持。坦率地说,我会质疑使用 DataTable 作为交换类型的适用性,更喜欢类型正确的 DTO。

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