如何读取晋升为二进制的工作流实例属性?
本文关键字:工作流 实例 属性 二进制 晋升为 何读取 读取 | 更新日期: 2023-09-27 17:51:12
在我的示例中,我提升了一个UInt64值。UInt64不能作为变量提升,所以我使用promoteAsBinary。
这是我要读的代码:
String sql =
@"Select Value33, InstanceId from
[System.Activities.DurableInstancing].[InstancePromotedProperties]
where PromotionName = 'MyUInt64'";
try
{
string connectionString = ConfigurationManager.ConnectionStrings
["InstanceStore"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
using (SqlDataReader reader = cmd.ExecuteReader())
{
Console.WriteLine("Promoted values:");
while (reader.Read())
{
byte[] result = (byte[])reader["Value33"];
// How do I turn this byte[] into an UInt64??
}
}
}
}
catch (Exception exception)
{
Console.WriteLine("Query Unhandled exception: {0}",
exception.Message);
}
我尝试将字节[]传递给MemoryStream,然后使用默认编码,ascii和UTF-8的BinaryReader,它不起作用。我得到一个垃圾值。我将实例编码设置为none。
storeBehavior.InstanceEncodingOption =
InstanceEncodingOption.None;
我遇到了和你一样的问题。
我做了下面的方法。您可以使用gzip来保存工作流数据。如果您使用此选项,则将compressed设置为true。泛型是对数据进行除菌处理的类型。
BTW:抱歉嵌套使用结构。你应该避免这种结构这是一种不好的处理方式。参见:http://msdn.microsoft.com/en-us/library/ms182334.aspx
public T DeserializeBinaryData<T>(byte[] serializedBinaryData)
{
using (var memoryStream = new MemoryStream())
{
memoryStream.Write(serializedBinaryData, 0, serializedBinaryData.Length);
memoryStream.Position = 0;
if (compressed)
{
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
using (
var dictionaryReader = XmlDictionaryReader.CreateBinaryReader(gZipStream,
XmlDictionaryReaderQuotas
.Max))
{
var netDataContractSerializer = new NetDataContractSerializer();
var deserializedData = netDataContractSerializer.ReadObject(dictionaryReader);
return (T)deserializedData;
}
}
}
using (
var dictionaryReader = XmlDictionaryReader.CreateBinaryReader(memoryStream,
XmlDictionaryReaderQuotas
.Max))
{
var deserializedData = new NetDataContractSerializer().ReadObject(dictionaryReader);
return (T)deserializedData;
}
}
}