Java 转换为字节[]和String.getBytes

Java 转换为字节[]和String.getBytes,java,Java,作为练习的一部分,我必须编写一个远程类加载器。它从服务器下载一个类,然后使用defineClass加载它 我是这样做的: in=new ObjectInputStream(s.getInputStream()); Object o = in.readObject(); return defineClass(className,o.toString().getBytes(), 0, o.toString().length()); 我得到了一个java.lang.ClassFormatError:

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

我是这样做的:

in=new ObjectInputStream(s.getInputStream());
Object o = in.readObject();
return defineClass(className,o.toString().getBytes(), 0, o.toString().length());
我得到了一个
java.lang.ClassFormatError:不兼容的魔法值

但是当我写这个的时候

in=new ObjectInputStream(s.getInputStream());
byte[] classData=(byte[])in.readObject();
return defineClass(className,classData, 0, classData.length);
它像预期的那样工作

这是为什么?

Object.toString()
string返回对象的
人类可读形式
,因此如果在
array
对象上调用
toString
,它将返回
默认toString

默认的toString实现是

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
你可以清楚地看到这不是你想要的

您可以将构造函数与
字符集
或默认字符集一起使用,将
字节[]
转换为字符串

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

参考资料:


我的解释是,之所以会发生这种情况,是因为java中的
objectinputstream
有点像
byteinputstream
。因此,您可以使用第二种解决方案。由于对象的
toString()
实现,第一个不起作用。

toString
不编码对象的字节-它返回一个包含对象信息的字符串。