我使用protobuf序列化数据集并将其从WCF服务发送到winfom客户端。
我在这里遇到两个问题......
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)。
是否有更好的方法来实现同样的目标。
当这个序列化失败并抛出错误...在客户端我得到通信异常时,它不知道出了什么问题。它唯一说的是......
&#34;在可靠会话完全完成之前,基础安全会话出现故障。可靠的会话出了问题。&#34;
我已尝试在WCF服务端设置以下内容,但没有用...
<serviceDebug includeExceptionDetailInFaults="true" />
也试过传递FaultException ...没有运气
如何将正确的异常和信息从WCF服务传递给我的客户端。
提前致谢。
答案 0 :(得分:1)
最终,protobuf-net对object
有一些非常基本的反对意见。它也没有为DataTable
提供预先构建的支持。坦率地说,我挑战使用DataTable
作为交换类型的适合性,更喜欢使用良好类型的DTO。
如果由于某种原因必须使用DataTable
,我想知道你最好的选择是单独序列化,确保使用二进制格式(参见RemotingFormat
)并写入{{1} },然后取出字节(在这种情况下为MemoryStream
),然后将ToArray
交给WCF。在另一端反转。