2010-03-06 21 views
26

Mój problem jest, gdy próbuje odczytać obiektowi po raz drugi, to rzuca wyjątek:StreamCorruptedException: nieprawidłowy kod typu: AC

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

java.io.StreamCorruptedException: invalid type code: AC 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
    at Client.run(BaseStaInstance.java:313) 

Pierwszy raz wysłać dokładną wiadomość samego obiektu; jednak gdy spróbuję zrobić to samo za drugim razem, spowoduje to błąd powyżej. Czy muszę ponownie zainicjować metodę readObject()? Wydrukowałem nawet obiekt wiadomości, który jest odbierany przez wiersz poniżej i dokładnie taki sam, jak pierwszy przypadek, w którym działa poprawnie.

Object buf = myInput.readObject(); 

Zakładam, że jest jakiś problem z dołączaniem, ale naprawdę nie mam żadnego pożytku z dołączania. Chcę za każdym razem czytać świeżą linię. Naprawdę doceniam pomoc w naprawieniu tego błędu. Dziękuję Ci.

==================================

Przed tym jednej linii, jestem właśnie tworzenie obiektów wejściowych i wyjściowych dla gniazda w metodzie run(). Deklaracja obiektu znajduje się poza metodą run() w klasie: -

@Override 
public void run() { 
    try { 
     sleep((int) 1 * 8000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     //Creating input and output streams to transfer messages to the server 
     myOutput = new ObjectOutputStream(skt.getOutputStream()); 
     myInput = new ObjectInputStream(skt.getInputStream()); 
     while (true) { 
      buf = myInput.readObject(); 
     } 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Masz rację; Nie zamykaj przedmiotu. Nie jestem pewien, jak to zrobić.

+0

nie jestem pewien, gdzie się zamknąć obiekt –

+0

NB Należy złapać EOFException i nie traktować go jako błąd: nie rejestruj ani nie drukuj śladu stosu; pozwól mu zakończyć pętlę czytania. Nie wiem, dlaczego łapiesz UnknownHostException tam, gdzie jesteś: nie można go wyrzucić z odpowiedniego bloku try. Sen() to dosłownie strata czasu. Usunąć to. – EJP

Odpowiedz

54

Podstawowym problemem jest to, że używasz nowego ObjectOutputStream do zapisywania w istniejącym już ObjectInputStream, do którego wcześniej użyłeś wcześniejszej wersji. Strumienie te mają nagłówki napisane i przeczytane przez odpowiednich konstruktorów, więc jeśli utworzysz kolejny ObjectOutputStream, napiszesz nowy nagłówek, który zaczyna się od - zgadnij co? - 0xAC, i istniejący ObjectInputStream nie spodziewa się kolejnego nagłówka w tym miejscu, więc barfuje.

W wątku forum Java cytowanym przez @trashgod, powinienem pominąć część o "od nowa dla każdego obiektu na obu końcach": to po prostu marnotrawstwo. Używaj pojedynczych OOS i OIS przez cały czas użytkowania gniazda i nie używaj żadnych innych strumieni w gnieździe.

Jeśli chcesz zapomnieć o tym co napisałeś, użyj ObjectOutputStream.reset().

i nie używać żadnych innych strumieni lub Readers lub Writers na tym samym gnieździe. Funkcje API strumienia obiektów mogą obsługiwać wszystkie podstawowe typy danych Java i wszystkie klasy Serializable.

+1

+1 @rookie: To jest poprawna odpowiedź i pochodzi z oryginalnego źródła! :-) – trashgod

+0

@ EJP evrytime uruchamiam kod, tworzony jest nowy OOS i OIS. jak sobie z tym poradzić? –

+0

@AkhilKNambiar Nie wiem o co mnie pytasz, na co nie ma już odpowiedzi powyżej. – EJP

-1

obliczu podobnego wyjątku podczas korzystania Java 7/8, i rozwiązać go poprzez dodanie poniżej VM argumentu

-Dsun.lang.ClassLoader.allowArraySyntax=true 
+0

"Podobne" nie jest takie samo. Nie rozwiązuje to problemu zgłoszonego przez PO. – EJP

Powiązane problemy