转换为byte []和String.getBytes

时间:2012-10-29 17:32:35

标签: java

作为练习的一部分,我必须编写一个远程类加载器。它从服务器下载一个类,然后使用defineClass加载它。

我做的是这样的:

in=new ObjectInputStream(s.getInputStream());
Object o = in.readObject();
return defineClass(className,o.toString().getBytes(), 0, o.toString().length());

我得到了java.lang.ClassFormatError: Incompatible magic value

但是当我写这个

in=new ObjectInputStream(s.getInputStream());
byte[] classData=(byte[])in.readObject();
return defineClass(className,classData, 0, classData.length);

它按预期工作。

为什么?

2 个答案:

答案 0 :(得分:3)

Object.toString()字符串会向您返回human readable form of Object因此,如果您在toString对象上调用array,则会返回default toString

默认的toString实现是

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

你可以清楚地看到这不是你想要的。

您可以将String构造函数与Charset或默认字符集结合使用,将byte[]转换为字符串

byte[] utf8Bytes = original.getBytes("UTF8");
String roundTrip = new String(utf8Bytes, "UTF8");

参考文献:

答案 1 :(得分:0)

我的解释是因为java中的objectinputstream有点byteinputstream。因此你可以使用第二种解决方案。第一个因为toString()实现Object而无法工作。