我正在使用 ObjectInputStream 通过 TCP 连接发送封装在 SignedObject 中的 Message 对象中的对象。这是基本代码:
发送
Object data = someObject;
ObjectOutputStream = new ObjectOutputStream(socket.getOutputStream());
Message newMsg = new Message(data);
out.writeObject(security.signObject(newMsg,privKey));
收到
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Object line = in.readObject();
SignedObject messageIn = (SignedObject) line;
Message msg = (Message) messageIn.getObject();
Message 类是一个基本类,只有字段,没有方法。其中一个字段是 Object Message.data,在本例中包含 siena.Filter 或 siena.Notification。当我调用 SignedObject.getObject() 时,我得到一个 InvalidObjectException。堆栈跟踪如下。
java.io.InvalidObjectException: siena.SENPInvalidFormat
at siena.Filter.readObject(Filter.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.security.SignedObject.getObject(Unknown Source)
消息传输的代码是正确的。它适用于其他类的许多其他情况,甚至适用于同一类的其他版本。它不适用于特定版本的 siena.Filter 和 siena.Notification。
我可以看到正在发送的类的 readObject() 方法(siena.Filter 或 siena.Notification)正在被调用,但我不知道这是否应该发生。我知道在 siena 方法中抛出了一个异常,我猜这会导致 InvalidObjectException。
所以问题是,是 siena.class.readObject() 抛出异常并且没有正确写入的问题,还是 siena.class.readObject() 被调用的问题?如果是后者,我将如何解决这个问题?
谢谢,大卫