【问题标题】:ClassCastException ObjectStreamClass cannot be cast to java.lang.String when deserializing反序列化时无法将 ClassCastException ObjectStreamClass 强制转换为 java.lang.String
【发布时间】:2013-05-10 11:14:23
【问题描述】:

我正在尝试序列化、发送和接收以下类的实例(ServerGameDataObject object = new ServerGameDataObject())

public class ServerGameDataObject implements Serializable {
    private static final long serialVersionUID = 5410058267505412928L;

    private TestClass t1 =null;
    private TestClass t2 =null;

    public ServerGameDataObject(){

        t1 = new TestClass();
        t2 = new TestClass();

    }
}

其中TestClass的定义是:

import java.io.Serializable;


public class TestClass  implements Serializable{
    transient public static final long serialVersionUID = -3089302783006861199L;

    private int val =-1;
    public  TestClass(){
        val=-1;

    }
}

..... 对象发送如下:

    ObjectOutputStream o = new AppendingObjectOutputStream(
            <some outputstream>);

    o.writeUnshared(object);
    o.flush();

AppendingObjectOutputStream 的定义是:

public class AppendingObjectOutputStream extends ObjectOutputStream {

    public AppendingObjectOutputStream(OutputStream out) throws IOException {
        super(out);
    }

    @Override
    protected void writeStreamHeader() throws IOException {
        // do not write a header, but reset:
        // this line added after another question
        // showed a problem with the original
        reset();
    }

}



 The code on the receiving end is :

    Object o = null;
   while ((o = inputStream.readUnshared()) != null) { // this is Receiver.java, line 74
    ...
    }

inputStream is an instance of ObjectInputStream 

在接收端抛出此异常:

> 05-10 10:54:51.572: E/AndroidRuntime(3133): FATAL EXCEPTION:
> Thread-134 05-10 10:54:51.572: E/AndroidRuntime(3133):
> java.lang.ClassCastException: java.io.ObjectStreamClass cannot be cast
> to java.lang.String 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readFieldDescriptors(ObjectInputStream.java:935)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:1744)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1656)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:683)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1806)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:1963)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readFieldValues(ObjectInputStream.java:1140)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:455)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObjectForClass(ObjectInputStream.java:1372)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readHierarchy(ObjectInputStream.java:1269)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1858)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readObject(ObjectInputStream.java:2006)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> java.io.ObjectInputStream.readUnshared(ObjectInputStream.java:1978)
> 05-10 10:54:51.572: E/AndroidRuntime(3133):   at
> Receiver.run(Receiver.java:74)

如果在 ServerGameDataObject 中我将 t2 定义为瞬态(瞬态私有 TestClass t2 =null; ),那么我会接收对象

怎么了?为什么我不能同时收到 t1 和 t2 ?

【问题讨论】:

    标签: java serialization deserialization classcastexception


    【解决方案1】:

    这里有很多错误。

    1. 第一次写入必须使用普通的ObjectOutputStream,只有在追加时才使用追加版本。如果输出是一个套接字,那么在套接字的生命周期内使用相同的ObjectOutputStream 确实更有意义。

    2. readObject()readUnshared() 不要在 EOS 返回 null。他们抛出EOFException。所以在它们不返回 null 时循环是不正确的。

    【讨论】:

    • 1.我已经这样做了,上面的 是在第一次写入 2 之后获得的。我会研究一下。无论如何,当两个 TestClass 之一是瞬态的时,应用程序可以工作。当没有瞬态时,我需要让它工作。
    • 在这种情况下,不起作用的类可能具有不正确的 readObject() 或 writeObject() 方法。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多