protobuf 和 WCF 的序列化问题
Serialization issue with protobuf and WCF
我正在使用 protobuf 序列化数据集并将其从 WCF 服务发送到 winfom 客户端。
我在这里面临两个问题...
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)。
有没有更好的方法来达到同样的效果。
当此序列化失败并抛出错误时...在客户端,我收到通信异常,其中不包含任何线索 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。在另一端反转。
我正在使用 protobuf 序列化数据集并将其从 WCF 服务发送到 winfom 客户端。
我在这里面临两个问题...
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)。
有没有更好的方法来达到同样的效果。
当此序列化失败并抛出错误时...在客户端,我收到通信异常,其中不包含任何线索 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。在另一端反转。