Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从对象到对象的转换_Java_Sockets_Exception_Casting_Stream - Fatal编程技术网

Java 从对象到对象的转换

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;

我正在开发一个类来简化套接字的处理。我有一个InputStream,其中包含接收到的消息,我希望在用户声明我的类时将其转换到用户定义的另一个类。这就是代码

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
。当然,表示对象图可能很困难。除非您真的需要,否则我不建议在字节级别上操作,因为大多数对象都不提供从字节创建它们/将它们轻松转换为字节的方法。最后我解决了这个问题。这是因为我想要发送的对象的类。客户端和服务器端的类必须完全相同。是的,除了包名,包名也需要相同!就这样!;)