Serializacja obiektów pomiędzy dwoma programami

0

Hej!
Obiekt mi się serializuje i deserializuje prawidłowo w ramach jednego projektu. Tzn pewną klasę sobie zapisuje i wczytuje.
Natomiast taką samą klasę ma zadeklarowaną w innym programie i niestety jest błąd przy deserializacji... Ma ktoś jakiś pomysł?? Externalizable? RMI ?
Klasa która występuje w dwóch projektach

 

public class UstawieniaTestu implements Serializable {
  String KomunikatPowitalny = null;
  String WygladProgramu = null;
  String AutorTestu = null;
  
}

kod serializacji w Edytorze

 

    public boolean ZapiszUstawieniaTestuDoPliku(String nazwa_pliku)
    {
        UstawieniaTestu Ustawienia = new UstawieniaTestu();
        Ustawienia.AutorTestu = AutorTestujTextField.getText();
        Ustawienia.KomunikatPowitalny = KomunikatPowitalnyjTextField.getText();
        Ustawienia.WygladProgramu = (String)WygladProgramujComboBox.getSelectedItem();
        try
        {
            ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(nazwa_pliku));
            out.writeObject(Ustawienia);
            out.close();
         } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(this, e.toString(), "Błąd", JOptionPane.ERROR_MESSAGE);
         } catch (IOException e) {
            JOptionPane.showMessageDialog(this, e.toString(), "Błąd", JOptionPane.ERROR_MESSAGE);
         }


        return true;
    }

Kod deserializacji ktory jest identyczny w obu projektach

    void OtworzPlikZUstawieniamiTestu(String nazwa_pliku)
    {   
        UstawieniaTestu Ustawienia = null;
        try
        {
            ObjectInputStream in = new ObjectInputStream(new FileInputStream(nazwa_pliku));
            Ustawienia = (UstawieniaTestu) in.readObject();
            in.close();
        }
        catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(this, e.toString() + " " + nazwa_pliku, "Błąd", JOptionPane.ERROR_MESSAGE);
         } catch (IOException e) {
            JOptionPane.showMessageDialog(this, e.toString() + " " + nazwa_pliku, "Błąd", JOptionPane.ERROR_MESSAGE);
         }
           catch (ClassNotFoundException e) {
            JOptionPane.showMessageDialog(this, e.toString() + " " + nazwa_pliku, "Błąd", JOptionPane.ERROR_MESSAGE);
        }
            //JOptionPane.showMessageDialog(this, Ustawienia.KomunikatPowitalny, "Informacja", JOptionPane.INFORMATION_MESSAGE);
            
    }

W obrębie programu który serializaje i deserializuje jest ok, natomiast program który tylko deserializuje to już jest błąd ClassNotFoundException.

Moze serializowana jest wersja z ktorego programu jest zapisywane??

0

A czy program deserializujący ma tą clasę w Classpath?

0
Koziołek napisał(a)

A czy program deserializujący ma tą clasę w Classpath?

Hmmm tzn. plik z klasa (UstawieniaTestu.java) jest identyczny w obu projektach, natomiast z Classpath nic nie przestawiałem. Używam NetBeans 7.0, JDK 1.6u26.
A może po prostu do pliku serializowanego z programu1 jest zapisywany niejaki "odcisk" instancji, i w drugim programie jest inny i się nie zgadza...
Kompilować się wszystko kompiluje.
Z tego co pamiętam, np w dawnych czasach robiłem coś podobnego z Pascalowskimi plikami rekordowymi i to się przenosiło między programami. W C# przenosiłem serializowane klasy do XML, ale z serializacją bajtową to nie wiem jak to wygląda pomiędzy programami...

0

Aby deserializacja się powiodła klasa musi mieć ten sam serialVersionUID w obu aplikacjach. SerialVersionUID chyba można podejrzeń poprzez javap -c albo coś podobnego.

0

SerialVersionUID możesz też sam sobie ustawić.
Klasa serializowana jest w obu aplikacja w takim samym pakiecie? Najlepiej jakbyś ja wyjął ja jakiejś osobnej biblioteki jar i importował do obu projektów.

0

Tzn. to są dwa osobne projekty w NetBeans. Ustawiłem w obu klasach :

 
private static final long serialVersionUID = 1L;

Ale nadal jest ten błąd :( Kurcze :( Może poszukam coś w książce do Javy....

0

A wklej kompletny stacktrace.. może coś zgubiłeś?

0

Coś takiego :

 
ava.lang.ClassNotFoundException: edytortestow.UstawieniaTestu
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:247)
	at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:603)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
	at tester.TesterOknoGlowneJFrame.OtworzPlikZUstawieniamiTestu(TesterOknoGlowneJFrame.java:102)
	at tester.TesterOknoGlowneJFrame.<init>(TesterOknoGlowneJFrame.java:40)
	at tester.TesterOknoGlowneJFrame$1.run(TesterOknoGlowneJFrame.java:126)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
	at java.awt.EventQueue.access$000(EventQueue.java:84)
	at java.awt.EventQueue$1.run(EventQueue.java:602)
	at java.awt.EventQueue$1.run(EventQueue.java:600)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
0

a używałeś narzędzia w JDK serialver ???

0

Przy używaniu serialver wyskakiwały jakieś wyjątki, jeśli chciałem odczytać UID swojej własnej klasy...
Ściągnąłem taką wtyczkę do NetBeans : UUIDGenerator http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=9000
Pobrałem UID klasy której używa edytor testów, ustawiłem takie samo w testerze... i nadal błąd :/ A może osobnego jara dla tej klasy stworzyc i importować???
///

Dobra, znalazłem rozwiązanie :) :)
Tworze w NetBeans nowy projekt klasy "New Class Library" i paczkę ustawieniatestulibrary i tam dodaje klasę którą będę serializować.
Kompiluje i mam nowego Jara z tą klasą...
Później w obu projektach importuje ten sam plik jar (UstawieniaTestuLibrary.jar) - > (Properties->Libriaries->Add Jar/Files)
No i w obu projektach odwołuje się do klasy poprzez ustawieniatestulibrary.UstawieniaTestu
Oczywiście ustawiam UID na wszelki wypadek...
Ciekawe czy jest jakaś inna metoda poza "wspólnym" plikiem JAR z tą klasą którą serializuje/deserializuje w obu programach.

0

@up a właściwie czemu nie użyłeś RMI?

0

Taka metoda z kopiowaniem tych samych klas w dwóch projektach oraz zapis/odczyt klas z pliku pomiędzy dwoma programami działał w Delphi/Object Pascalu(pliki rekordowe to odpowiednik serializacji niejako).
O RMI też myślałem, ale chyba na taki projekt to byłby przerost formy nad treścią... Taka metoda chyba jest prostsza w przypadku odczytu pliku który jedne program zapisuje/odczytuje a drugi tylko odczytuje....
Zresztą nie jestem specem od Javy :) Aczkolwiek robiąc projekty człowiek się uczy... Przy okazji sporo się oczytałem o serializacji :))

1 użytkowników online, w tym zalogowanych: 0, gości: 1