0

我有一个 Java 应用程序,允许用户将数据存储在数据库中,但在存储时我将这些数据存储为与 cassandra 相同的字节数组,现在当我返回字节数组时,我想将这些数据转换为用户保存的数据,这意味着如果用户保存为 Long 我想显示 long 值,或者如果用户保存 String 我想显示 String 值。现在,如果我将所有字节数组字段转换为字符串,显然长字节数组将显示为野生 char.string 字段就可以了。

请建议我如何在java中解决这个问题。它类似于 cassandra 存储数据的方式。cassandra 将所有数据存储为字节数组。

基本上我想知道字节数组的数据类型。

4

2 回答 2

1

你的问题不是很清楚你到底想要什么,但是......

您可以提出一些自定义方案来执行此操作,例如数组的第一个字节指示什么类型,其余字节是实际数据。然后,您需要编写代码将 byte[1] 到 byte[length-1] 转换为给定的类型。对我来说,这似乎是很多工作。

我可能会尝试使用对象序列化。它基本上可以完成您在此处询问的内容,无需任何自定义代码。

public static void main(String[] args) throws Exception {
    String strValue = "hello";
    int myInt = 3;
    long myLong = 45677;
    short myShort = 1;
    double myFloat = 4.5;

    serializeThenDeserialize(strValue);
    serializeThenDeserialize(myInt);
    serializeThenDeserialize(myLong);
    serializeThenDeserialize(myShort);
    serializeThenDeserialize(myFloat);
}

private static void serializeThenDeserialize(Object value) throws Exception {
    System.out.println("Input Type is " + value.getClass() + " with value '" + value + "'");
    ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(byteArrayStream);
    out.writeObject(value);
    out.close();

    byte[] objectAsBytes = byteArrayStream.toByteArray();
    // Persist here..


    // Now lets deserialize the byte array
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(objectAsBytes));
    Object deserializedValue = in.readObject();
    in.close();

    System.out.println("Deserialized Type is " + deserializedValue.getClass() + " with Value '" + deserializedValue + "'");
    System.out.println();
}

运行它时,它就像我们想要的那样。返回数据并维护类型。

Input Type is class java.lang.String with value 'hello'
Deserialized Type is class java.lang.String with Value 'hello'

Input Type is class java.lang.Integer with value '3'
Deserialized Type is class java.lang.Integer with Value '3'

Input Type is class java.lang.Long with value '45677'
Deserialized Type is class java.lang.Long with Value '45677'

Input Type is class java.lang.Short with value '1'
Deserialized Type is class java.lang.Short with Value '1'

Input Type is class java.lang.Double with value '4.5'
Deserialized Type is class java.lang.Double with Value '4.5'

这样做的好处是它适用于所有 Java 对象。不好的是,Java 对象序列化可能会随着您存储的对象的发展而变得有点麻烦(即,您删除方法、字段、使用不同的 JDK 编译等)。如果你坚持原语,你应该没有问题。如果您序列化自己的对象,您应该在此处阅读有关兼容和不兼容更改的更多信息。

于 2012-11-09T06:24:38.623 回答
0

我建议以某种格式序列化数据,存储类型信息,如 BSON:http ://bsonspec.org/或微笑:http ://wiki.fasterxml.com/SmileFormat

在这种情况下,反序列化将恢复类型信息,反序列化后您将获得正确类型的 Object。

这些格式非常紧凑:类型信息只需要几个额外的字节,而 java 标准序列化需要数百个字节来序列化最简单的对象。

于 2012-11-10T08:08:16.710 回答