我正在使用 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 文档中,我发现 tw.system.serializer.fromXml 适用于文本 XML 数据,但它不支持十六进制或二进制数据格式。
我需要什么:
我非常感谢任何在 IBM BPM 中实现这一目标的工作示例或建议。谢谢!
我无法帮助您解决问题的 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,然后像任何其他流一样反序列化该流。您可以找到许多有关如何进行基本反序列化的示例。