protobuf和WCF的序列化问题

时间:2018-01-19 05:40:34

标签: c# wcf serialization protobuf-net communicationexception

我使用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。"}

    < / LI>

    数据集序列化代码

    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,我们无法更改此值,因为这是legecy SP,并且该列包含不同类型的数据(decimal,int varchar)。

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

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

      &#34;在可靠会话完全完成之前,基础安全会话出现故障。可靠的会话出了问题。&#34;

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

       <serviceDebug includeExceptionDetailInFaults="true" />
      

      也试过传递FaultException ...没有运气

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

      提前致谢。

1 个答案:

答案 0 :(得分:1)

最终,protobuf-net对object有一些非常基本的反对意见。它也没有为DataTable提供预先构建的支持。坦率地说,我挑战使用DataTable作为交换类型的适合性,更喜欢使用良好类型的DTO。

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