Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中如何从字节数组中获取数据类型_Java_Cassandra - Fatal编程技术网

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

Java中如何从字节数组中获取数据类型,java,cassandra,Java,Cassandra,我有一个Java应用程序,允许用户将数据存储在数据库中,但在存储时,我将这些数据存储为字节数组,这与cassandra相同,现在当我返回字节数组时,我想将这些数据转换为用户保存的数据,这意味着如果用户保存的时间长,我想显示长值,或者如果用户保存的字符串,我想显示字符串值。现在,如果我将所有字节数组字段转换为字符串,显然长字节数组将显示为野生字符。字符串字段就可以了 请建议我如何用java解决这个问题。它类似于cassandra存储数据的方式。cassandra将所有数据存储为字节数组 基本上我想

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

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


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

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

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

我建议以某种格式序列化数据,该格式存储类型信息,如BSON:或Smile:

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


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

user1249655:这个问题对我来说毫无意义。我认为你应该认真思考你要解决的问题。你不是让一件非常简单的事情复杂化了吗?@user1249655:在存储类型的表中添加另一列。:)这真的是卡桑德拉的问题吗?是否有与之关联的模式?或者这只是一个java问题?答案会有所不同。是的,兰斯,看起来这可能会解决这个问题,但我最初的问题是我在cassadra中存储数据,当使用thrift api从cassandra检索数据时,我得到字节数组,现在我如何真正返回原始数据类型和数据。使用您的字节数组,您可以调用他的代码,对吗?(或者我遗漏了什么)您可以调用的代码是://现在让我们在=new ObjectInputStream(new ByteArrayInputStream(objectAsBytes))中反序列化字节数组ObjectInputStream;Object deserializedValue=in.readObject();in.close();