如何从Java中的字节数组中获取数据类型

时间:2012-11-09 05:54:23

标签: java cassandra

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

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

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

2 个答案:

答案 0 :(得分:1)

你的问题不是很明确,但是......

你可以想出一些自定义方案,就像数组的第一个字节指示什么类型,剩下的字节是实际数据。然后,您需要编写代码以将字节[1]到字节[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

答案 1 :(得分:0)

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

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

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