将byte []转换为java中的用户定义类

时间:2009-12-21 15:01:42

标签: java serialization

我想转换从socket得到的byte []我写的一个类(Message)。 我试过了

byte[] data=new btyte[100];
.
.
.
Message m=(Message)data;

但它没有用,给我错误 我该怎么办?

8 个答案:

答案 0 :(得分:16)

假设您正在谈论序列化对象:

试试这个:

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
Message message = (Message) in.readObject();
in.close();

如果您以其他方式序列化Message,则必须使用参数化构造函数或返回该类型的新实例的静态方法自行解析。

答案 1 :(得分:4)

您无法转换任意二进制数据(在Java中)。

该字节[]应该包含什么?如果它是类的序列化实例,则必须将套接字的InputStream包装在ObjectInputStream中。如果它是另一种定义良好的二进制格式,则必须手动解析它(注意:转储C结构不构成定义良好的二进制格式,应该避免使用)。

答案 2 :(得分:2)

你最好写一个函数去做。

Message parseDataFromSocket(byte[] bytes);

答案 3 :(得分:1)

尝试将ObjectInputStreamByteArrayInputStream一起使用。

看起来你正在尝试阅读一个序列化的类。

如上所述编辑为ByteArrayInputStream。

答案 4 :(得分:1)

您需要创建一个Message构造函数,它接受一个byte [](并使用它以某种方式初始化该对象)。然后你可以这样做:

Message m = new Message(data);

答案 5 :(得分:1)

如果字节数组已正常序列化,您可以使用ByteArrayInputStream,将其传递到ObjectInputStream并将生成的Object转换为Message类。

答案 6 :(得分:1)

这取决于字节数组的创建方式......您可以尝试:

ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data))
Message m = (Message) in.readObject();

答案 7 :(得分:1)

在Java中,无法执行此类强制转换(例如,在C ++中,可以定义转换构造函数等)。

您已使用'序列化'标记了该问题。假设您使用Java序列化API ,那么您应该通过data提供ObjectInputStream数组,以便将数组反序列化为宾语。可以找到更多信息here

此外,如果您使用了其他类型的序列化(例如,使用XStream序列化为XML),那么您应该使用相同的API反序列化(解组是另一个常见的名称)数据首先用于序列化它。