【问题标题】:Cast from Object to T从对象转换为 T
【发布时间】:2023-04-11 09:03:01
【问题描述】:

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

private T read() throws IOException, ClassNotFoundException{
    ObjectInput ois = new ObjectInputStream (reader);
    T message = (T) ois.readObject();
    return message;
}

但它会抛出异常:ClassNotFoundException 我不知道为什么。当 T 是 String 类型时,它工作得很好,但当它是一个自定义类时,它就不行了。

所以我在这里问:p 提前谢谢你

【问题讨论】:

  • 如果没有在方法或类声明中先定义它,就不能键入 T。
  • 不要将转换与转换混淆。在 Java 中,您只能将引用转换为对象已经是的类型。它不会将 String 转换为 MyClass。如果引用的对象已经是 MyClass,它只会让您将 Object 转换为 MyClass。如果要转换,则必须显式处理此转换。
  • @scorpion : T 是我的班级宣言。 Peter Lawrey:我的 inputStream 中的数据已经是 MyClass 类型

标签: java sockets exception casting stream


【解决方案1】:

请仔细检查您的序列化对象中定义的所有类型是否也在您的类型T中定义。

我认为@fabian 是正确的。

【讨论】:

    【解决方案2】:

    这似乎不是演员表的问题,而是从ObjectInputStream 读取Objects。这是ClassNotFoundExceptionObjectInputStream.readObject 的描述:

    找不到序列化对象的类。

    这意味着您忘记将InputStream 中的某些数据类添加到您的类路径中。

    【讨论】:

    • 我不认为它来自这里,因为如果在代码中放入一些 System.out,则此行正确传递,错误在演员表中抛出
    • @omaflak:演员表不是和readObject()的调用在同一行吗???当所有必要的类都在类路径中时,AFAIK ClassNotFoundException 不能被简单的强制转换抛出。它与String 一起工作的事实支持了我的主张。完整的堆栈跟踪 + 错误消息可以对此有所了解。请将其添加到您的问题中。
    • 是的,你说得对,对不起,我没有正确阅读你的答案。但最后我认为我不会投射我的对象。我很确定这是可能的,但我更喜欢之前问。我可以从输入流中读取字节并将它们写入一个新对象吗?
    • @omaflak: 如果你可以用原始数据和可序列化的“核心 java 类型”(StringFileArrayList 的可序列化对象,......可能会受到限制java 8 compact profile),您仍然可以安全地使用ObjectInputStreamObjectOutputStream。当然,表示对象图可能很困难。我不建议在字节级别上操作,除非你真的需要,因为大多数对象不提供从字节创建它们/将它们轻松转换为字节的方法。
    • 我终于解决了这个问题。这是因为我要发送的对象的类。客户端和服务器端的类必须完全相同。它是,除了包名也需要相同!就是这样了! ;)
    【解决方案3】:

    您可以尝试将消息设为Object 吗?

    ObjectInput ois = new ObjectInputStream (my_input_stream);
    Object message = (Object) ois.readObject();
    

    或者尝试在方法声明中添加<T>

    private <T> T read() throws IOException, ClassNotFoundException{
        ObjectInput ois = new ObjectInputStream (reader);
        T message = (T) ois.readObject();
        return message;
    }
    

    【讨论】:

    • 如果我按字节读取 inputStream 字节并将它们写入一个对象,它应该可以工作,不是吗?
    • 这很奇怪,因为它适用于我的自定义类
    • 我更新了我的问题。实际上代码在一个函数中。我应该在“私人”之后添加 吗?
    猜你喜欢
    • 2011-05-06
    • 2012-06-02
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多