如何从数据库检索的十六进制数据反序列化 IBM BPM 中的业务对象?

问题描述 投票:0回答:1

我正在使用 IBM BPM (BAW) 并尝试反序列化从数据库中以十六进制格式检索的业务对象 (BO)。

使用以下 SQL 查询提取数据:

DECLARE @BinaryData VARBINARY(MAX);

\-- Assigning value to the variable
SELECT @BinaryData = DATA
FROM \[BPMDB\].\[baw\].\[LSW_INSTANCE_DATA\]
WHERE BPD_INSTANCE_ID = id;

\-- Converting to HEX format
SELECT CONVERT(VARCHAR(MAX), @BinaryData, 2) AS HexData;

这将返回一个十六进制字符串,如下所示:

0x3C54686973206973206120746573742E2E2E3E

我的目标:

  • 将此十六进制字符串转换回二进制数据。
  • 使用 IBM BPM 将此二进制数据反序列化为工作业务对象 (BO)。

从 IBM BPM 文档中,我发现 tw.system.serializer.fromXml 适用于文本 XML 数据,但它不支持十六进制或二进制数据格式。

我需要什么:

  • 一种将十六进制字符串转换为二进制数组的方法。
  • 用于将此二进制数据反序列化为 IBM BPM 中的业务对象的方法或代码示例(JavaScript 或 Java)。

我非常感谢任何在 IBM BPM 中实现这一目标的工作示例或建议。谢谢!

java xml hex deserialization ibm-bpm
1个回答
0
投票

我无法帮助您解决问题的 BPM 部分(一般来说,您应该将您在 SO 上的帖子一次限制为一个问题),但十六进制转换很容易。

如果您使用的是 Java 17 或更高版本,那么 HexFormat 是最佳选择。

jshell> byte[] byteArray = java.util.HexFormat.of().parseHex("3C54686973206973206120746573742E2E2E3E");
byteArray ==> byte[19] { 60, 84, 104, 105, 115, 32, 105, 115, 3 ... 115, 116, 46, 46, 46, 62 }

如果您使用的是较旧的 JVM,那么使用 BigInteger 是最简单的方法。

jshell> var temp = new BigInteger("3C54686973206973206120746573742E2E2E3E", 16);
temp ==> 1345397673462976114652632802180285954431790654
jshell> byte[] byteArray = temp.toByteArray();
byteArray ==> byte[19] { 60, 84, 104, 105, 115, 32, 105, 115, 3 ... 115, 116, 46, 46, 46, 62 }

如果 BPM 的序列化只是 java 标准序列化,您可以将 ByteArray 转换为 ByteArrayInputStream,然后像任何其他流一样反序列化该流。您可以找到许多有关如何进行基本反序列化的示例。

© www.soinside.com 2019 - 2024. All rights reserved.