2010-05-26 15 views
7

atar. Sorun, sunucu tarafında ClassNotFoundException almaya devam etmekti.readObject yöntem Java almaya çalışırken ve istemci sunucuya üzerine kendinden tanımlı sınıfın (Mesaj) basit bir nesne göndermek yapmak için Java'nın istemci/sunucu ile etrafında test etmek istedim ediyorum ClassNotFoundException

Böyle String olarak diğer nesneleri sorunsuz geçmesi nedeniyle kodlarının kalanı yolunda görünmektedir düşünüyorum.

Ben istemci ve sunucu her biri için farklı yerlerde farklı iki netbeans projeleri vardı.

Her biri kendi paketler altında İleti sınıfının kendi kopyasına sahip. Mesaj sınıfı, Seri hale getirilebilir.

İstemci tarafında bir Message nesnesi göndermeye çalışıyorum. Sunucu tarafında

, readObject yöntemini çağırarak üzerine, bunun yerine kendi var müşterinin paketinden Mesajı sınıfını bulma gibi görünüyor. printStackTrace gösterdi: "Java.Lang.ClassNotFoundException: client.Message" Hatta dökme veya nesne henüz alınan saklamak için denemedim sunucu tarafında

üzerinde. Dışarıda bıraktığım bir şey mi var?

cevap

16

Paket adı ve sınıf adı tam olarak olmalıdır ve her iki tarafta da aynı olmalıdır. Yani Bir kez yazın, bir kez derleyin ve her iki tarafa da aynı kopyasını verin. Ayrı ayrı server.Message ve client.Message sınıfları yok, ancak tek bir shared.Message sınıfı veya benzeri bir şey.

aynı paket/sınıf adını garanti edemez, ama her zaman değil o tam aynı kopyası zaman, o zaman söz konusu Sınıf (lar) aynı değere sahip bir serialVersionUID alan eklemek gerekirse.

package shared; 

import java.io.Serializable; 

public class Message implements Serializable { 
    private static final long serialVersionUID = 1L; 

    // ... 
} 
+2

Ve bu diğer aptal geliştirici sahip girişime neden olabileceği için, serialUID tam 1L yapmayın lütfen aynı fikir. – Daniel

+0

Şimdi çalışıyor! Teşekkür ederim ~ !! Sonunda neler olduğunu anladım – eruina

+0

Neler oluyor? – BalusC

4

nedeni, ObjectInputStream içinde readObject() pratikte olarak uygulandığını:

String s = readClassName(); 
Class c = Class.forName(s); // Here your code breaks 
Object o = c.newInstance(); 
...populate o...