Java中是否有类似于<;重新解释铸件>;在C++;
我在我的函数消息数组中得到字节和对象类型,我需要从字节还原对象。在爪哇有C++中的任何类型吗?< P>不,你可以使用。< /P> < P>不,你需要序列化你的对象。Java中是否有类似于<;重新解释铸件>;在C++;,java,Java,我在我的函数消息数组中得到字节和对象类型,我需要从字节还原对象。在爪哇有C++中的任何类型吗?< P>不,你可以使用。< /P> < P>不,你需要序列化你的对象。 如果您的对象数据预期可以在其他语言中读取,则这可能没有用处。在Java中,没有办法拥有任意字节块,然后告诉编译器“您需要将其视为X类型的对象” 您想“还原到对象中”的字节最初是如何创建的 Java有一种序列化机制,可以将对象转换为字节流,反之亦然。我不确定您在这里要问什么,但Java中的每个对象(包括数组)都有与之相关的运行时类型
如果您的对象数据预期可以在其他语言中读取,则这可能没有用处。在Java中,没有办法拥有任意字节块,然后告诉编译器“您需要将其视为X类型的对象” 您想“还原到对象中”的字节最初是如何创建的
Java有一种序列化机制,可以将对象转换为字节流,反之亦然。我不确定您在这里要问什么,但Java中的每个对象(包括数组)都有与之相关的运行时类型信息。因此,当您将对象强制转换为其他类型时,如果新类型不匹配,将立即抛出异常。这与C/C++非常不同,在C/C++中,您可以告诉编译器将内存块视为您想要的任何对象
如果您正在寻找将任意字节集转换为对象的代码,或者相反,则需要使用不同的方法,使用内置的序列化功能,或者滚动您自己的转换代码。以下是实现所需功能的方法
public static Object toObjectFromByteArray(byte[] byteArr) {
if (byteArr == null) {
return null;
}
Object resultObj = null;
ByteArrayInputStream bin = null;
ObjectInputStream ooin = null;
try {
bin = new ByteArrayInputStream(byteArr);
ooin = new ObjectInputStream(bin);
resultObj = ooin.readObject();
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
finally {
try {
if (ooin != null) {
ooin.close();
}
if (bin != null) {
bin.close();
}
}
catch (IOException ex1) {
ex1.printStackTrace();
}
}
return resultObj;
}
public static byte[] toByteArray(Object obj) {
ByteArrayOutputStream barr = null;
ObjectOutputStream oout = null;
byte[] bytearr = null;
try {
byte[] b2 = null;
barr = new ByteArrayOutputStream(10000);
oout = new ObjectOutputStream(barr);
oout.writeObject(obj);
oout.flush();
oout.close();
bytearr = barr.toByteArray();
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
finally {
try {
if (oout != null) {
oout.close();
}
if (barr != null) {
barr.close();
}
}
catch (IOException ex1) {
ex1.printStackTrace();
}
}
return bytearr;
}
reinterpret\u cast
可以在Java中进行相当程度的模拟,但不能直接反序列化整个对象。正如其他人所建议的那样,Java的内置序列化机制或其他第三方序列化库将是您的朋友,除非您自己能够在发送端将对象分解为更简单的类型
至于Java是否有一个等价于reinterpret\u cast的特定问题,答案是部分肯定的。如果您试图从二进制数据流中读取原语,
ByteBuffer
是您的朋友。将它包装在一个字节数组中,告诉它数据是little endian还是big endian,然后使用它的各种方法对数据进行解码。这可以用来模拟各种C++代码> RealTytCase< /Cord>从字节转换为32位整数或浮点或任何东西。 < P>如果你真的想取一块内存,并重新解释它是java对象,你可以通过<代码> Sun。MISC。
您需要迭代对象的类/类型,找到需要设置的所有有效字段,从堆外内存缓冲区中读取它们的特定类型,并通过反射进行设置
这不是我推荐的,使用其他序列化机制将是一个更好的选择
编辑:可能是这样的:
类测试{
int x;
int-y;
}
公共静态void main(字符串[]args)引发异常{
final Unsafe=Unsafe.getUnsafe();
最终整数计数=2;
最终长地址=不安全的.allocateMemory(Integer.BYTES*计数);
对于(int i=0;i
当然,您可以轻松地将这些原语重新解释为任何内容。我甚至不需要
不安全的输入
,但显然我需要根据测试的输入
,谢谢@Hubbitus。我已经切换到另一个链接,它也解释了序列化。