Java 从对象到对象的转换
我正在开发一个类来简化套接字的处理。我有一个InputStream,其中包含接收到的消息,我希望在用户声明我的类时将其转换到用户定义的另一个类。这就是代码Java 从对象到对象的转换,java,sockets,exception,casting,stream,Java,Sockets,Exception,Casting,Stream,我正在开发一个类来简化套接字的处理。我有一个InputStream,其中包含接收到的消息,我希望在用户声明我的类时将其转换到用户定义的另一个类。这就是代码 private T read() throws IOException, ClassNotFoundException{ ObjectInput ois = new ObjectInputStream (reader); T message = (T) ois.readObject(); return message;
private T read() throws IOException, ClassNotFoundException{
ObjectInput ois = new ObjectInputStream (reader);
T message = (T) ois.readObject();
return message;
}
但它抛出了一个异常:ClassNotFoundException
我不知道为什么。当T是String类型时,它工作得很好,但当它是自定义类时,它就不工作了
所以我在这里问:p
提前谢谢你你能不能试着把这条信息变成一个
对象
ObjectInput ois = new ObjectInputStream (my_input_stream);
Object message = (Object) ois.readObject();
或者尝试在方法声明中添加
:
private <T> T read() throws IOException, ClassNotFoundException{
ObjectInput ois = new ObjectInputStream (reader);
T message = (T) ois.readObject();
return message;
}
private T read()引发IOException,ClassNotFoundException{
ObjectInput ois=新ObjectInputStream(读卡器);
T message=(T)ois.readObject();
返回消息;
}
这似乎不是演员阵容的问题,而是从ObjectInputStream
读取对象的问题。以下是ClassNotFoundException
的说明:
找不到序列化对象的类
这意味着您忘记将InputStream
中的某些数据类添加到类路径。请仔细检查序列化对象中定义的所有类型是否也在类型T
中定义
我认为@fabian是正确的。如果不在方法或类声明中首先定义t,就不能键入t。不要混淆强制转换和转换。在Java中,您只能对对象已经是的类型强制转换引用。它不会将say a字符串
转换为MyClass
。仅当引用的对象已经是MyClass时,它才允许您将对象
强制转换为MyClass
。如果要转换,必须显式处理此转换。@scorpion:T是我的类声明。Peter Lawrey:我的inputStream中的数据已经是MyClassi类型了如果我每字节读入inputStream字节,然后将它们写入一个对象,它应该会工作,不是吗?这很奇怪,因为它在自定义classI更新我的问题时对我有效。实际上,代码在一个函数中。我应该在“private”之后添加吗?我认为它不是从这里来的,因为如果在代码中放入一些System.out,这一行将正确传递,错误将在cast@omaflak:强制转换不是与调用readObject()
完全相同吗???当所有必需的类都在类路径中时,简单强制转换无法引发ClassNotFoundException
。它与String
一起工作的事实支持了我的说法。完整堆栈跟踪+错误消息可能会对此有所帮助。请把它添加到你的问题中。是的,你是对的。对不起,我没有正确阅读你的答案。但最后,我想我不会抛出我的目标。我很肯定这是可能的,但我宁愿先问问。。我可以从输入流中读取字节并将其写入新对象吗?@omaflak:如果您可以用原始数据和可序列化的“核心java类型”(可序列化对象的字符串,文件,数组列表,可能受到您想要使用的java 8压缩配置文件的限制),您仍然可以安全地使用ObjectInputStream
和ObjectOutputStream
。当然,表示对象图可能很困难。除非您真的需要,否则我不建议在字节级别上操作,因为大多数对象都不提供从字节创建它们/将它们轻松转换为字节的方法。最后我解决了这个问题。这是因为我想要发送的对象的类。客户端和服务器端的类必须完全相同。是的,除了包名,包名也需要相同!就这样!;)