我尝试从一个用于存储Spring会话的Redis服务器反序列化String到Java对象,并且我想在Spring框架之外反序列化它。我认为Spring Redis序列化器可能使用默认字符集UTF-8来将Java对象序列化为字符串。
Redis中的字符串:
private static void scanKeys(Jedis jedis, String prefix, String hashKey)
throws IOException, ClassNotFoundException {
Set<String> keys = jedis.keys(prefix + "*");
for (String key : keys) {
if (!key.contains("expir")) {
Map<String, String> sessionMap = jedis.hgetAll(key);
for (Entry<String, String> entry : sessionMap.entrySet()) {
if (entry.getValue() != null && entry.getKey().equals(hashKey)) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
byte[] output = entry.getValue().getBytes(charset);
System.out.println(Arrays.toString(output));
try {
Long id = (Long) deserialize(output);
System.out.println(id);
} catch (EOFException e) {
break;
}
}
}
}
}
}
public static Object deserialize(byte[] data) throws IOException, ClassNotFoundException {
ByteArrayInputStream in = new ByteArrayInputStream(data);
ObjectInputStream is = new ObjectInputStream(in);
return is.readObject();
}
错误消息:
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:862)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:354)
at practice.redis.jedis.App.deserialize(App.java:191)
at practice.redis.jedis.App.scanKeys(App.java:168)
at practice.redis.jedis.App.main(App.java:77)
我知道用UTF-8在Byte[]和String之间的转换很可能是问题所在,但我还是想问一下,是否有人知道如何在不修改序列化部分的情况下解决这个问题。
我建议您自己解析字符串。它看起来像是转义和未转义字节的简单序列。
String value = "\\xAC\\xED\\x00\\x05sr\\x00\\x0Ejava.lang.Long;\\x8B\\xE4\\x90\\xCC\\x8F#\\xDF\\x02\\x00\\x01J\\x00\\x05valuexr\\x00\\x10java.lang.Number\\x86\\xAC\\x95\\x1D\\x0B\\x94\\xE0\\x8B\\x02\\x00\\x00xp\\x00\\x00\\x00\\x00\\x00\\x00\\xD7";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
int i = 0;
while (i < value.length()) {
char ch = value.charAt(i);
if (ch == '\\') {
if (value.charAt(i + 1) != 'x') {
throw new UnsupportedOperationException();
}
String hex = value.substring(i + 2, i + 4);
byteArrayOutputStream.write(Integer.parseInt(hex, 16) & 0xFF);
i += 4;
} else {
byteArrayOutputStream.write(ch);
i++;
}
}
byte[] output = byteArrayOutputStream.toByteArray();
Long id = (Long) deserialize(output);
System.out.println(id);
}
问题内容: 如何将上述字符串反序列化为java对象。 我正在使用的类是 问题答案: @基达 我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。 我已经修改了输入字符串供您考虑,这将导致非null的LocalLocationId 如果我对输入字符串的假设不正确,请发表评论。 编辑1:由于无法修改输入,请考虑编写自定义解串器。以下是
问题内容: 我能够将一个对象序列化为一个文件,然后再次还原它,如下面的代码片段所示。我想将对象序列化为字符串并存储到数据库中。谁能帮我? 问题答案: 你应该使用BLOB。使用JDBC非常简单。 你发布的第二个代码的问题是编码。你还应该对字节进行编码,以确保它们均不会失败。 如果你仍然想将其记录为字符串,则可以使用java.util.Base64对字节进行编码。 仍然应该将CLOB用作数据类型,因为
问题内容: 我需要将对象序列化为String并反序列化。 我阅读了关于stackoverflow的建议,并编写了以下代码: } 但我得到错误: 为什么?我预期:dx = 5 dy = 3 怎样做才好?啊。我不想在文件中写入此对象。我必须使用字符串格式。 问题答案: 使用 代替 ,因为String转换会破坏数据(由于编码)。 如果确实需要将结果存储在字符串中,则需要一种安全的方法将任意字节存储在字符
问题内容: 我有一些具有各种属性的JSON,其中大多数是简单数据类型。但是,我在JSON中有一个属性,当我将其反序列化为C#类时,我只需要将其反序列化为字符串即可。 JSON示例: 除了将是有效的JSON对象外,“ json”对象没有任何设置结构。 因此,在上面的示例中,“ json”的值是一个JSON对象-但是当它反序列化时,我需要将它作为字符串。 因此,如果我的C#类是: 然后,如果我使用:
我正在尝试使用来部分地反序列化模型,因此其中一个属性被读取为包含原始JSON的字符串。 示例代码 应该生成模型,其中属性将原始JSON中的Info对象作为字符串包含: 它不能开箱即用并抛出异常: System.Text.Json.JsonException:--- 到目前为止我尝试了什么: 并将其应用于模型中 并将选项添加到 尽管如此,它还是抛出了相同的异常: System.Text.Json.J
我的JSON如下所示: 我的课程如下所示: 如何反序列化到映射如和到