如何读取晋升为二进制的工作流实例属性?

本文关键字:工作流 实例 属性 二进制 晋升为 何读取 读取 | 更新日期: 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;
            }
        }
    }