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

请建议我如何用Java解决此问题。它类似于cassandra的数据存储方式。cassandra将所有数据存储为字节数组。

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

最佳答案

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

您可以提出一些自定义方案来执行此操作,例如数组的第一个字节指示什么类型,其余字节为实际数据。然后,您需要编写代码以将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进行编译等)。如果您坚持使用原语,那么应该不会有任何问题。如果序列化自己的对象,则应阅读有关兼容和不兼容更改的更多信息here

09-04 02:47
查看更多