2013-05-10 2 views
0

Я пытаюсь сериализации, отправлять и получать экземпляр ниже класса (ServerGameDataObject объект = новый ServerGameDataObject())ClassCastException ObjectStreamClass не может быть приведен к java.lang.String при десериализации

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;), затем я делаю REICEIVE объектов

Что случилось? Почему я не могу получить как t1, так и t2?

ответ

0

Многочисленные ошибки здесь.

  1. Вы должны использовать нормальный ObjectOutputStream для первой записи, и прилагаемой версии только тогда, когда вы добавления. Если выход представляет собой сокет, на самом деле имеет смысл просто использовать тот же самый ObjectOutputStream для срока службы сокета.

  2. readObject() и readUnshared() не возвращаются null в EOS. Они бросают EOFException. Так что цикл, когда они не возвращают значение null, неверен.

+0

1. Я делаю это уже <некоторые OutputStream> выше получается после первой записи 2. Я буду смотреть в него. Независимо от того, приложение работает, когда один из двух тестовых кластеров является временным. Мне нужно заставить его работать, когда нет преходящего. – user1386187

+0

В этом случае класс, который не работает, вероятно, имеет неправильный метод readObject() или writeObject(). – EJP

Смежные вопросы