Przesyłanie obiektu przez sieć.

0

Hej

Mam dwie aplikację klient oraz serwer. Próbuję między nimi wysłać przez sieć obiekt.

definicja klasy:

public class message implements Serializable {
    String message;
    boolean popup;
    public message(String w, boolean p) {
        String message = w;
        boolean popup = p;
    }
    
    public String getMessage() {
        return message;
    }
    public void setMessage(String m) {
        message = m;
    }
    
    public boolean getPopup() {
        return popup;
    }
    public void setPopup(boolean p) {
        popup = p;
    }

Metoda wysyłająca

    public void RozeslijWiadomosc() {
            Iterator it = SerwerWiadomosci.KlienciArrayList.iterator();
            while(it.hasNext()) {
                try {
                    SerwerWiadomosci.klient k = (SerwerWiadomosci.klient) it.next();            
                    ObjectOutputStream pisarz = (ObjectOutputStream) k.getObjectOutputStream();
                    message b = new message("xxx", false);
                    pisarz.writeObject(b);
                    pisarz.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
    } 

Niestety coś mi nie działa, dostaje takie komunikaty..

java.io.NotSerializableException: org.jdesktop.layout.GroupLayout
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1180)
	at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:161)
	at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1687)
	at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:478)
	at java.awt.Container.writeObject(Container.java:3681)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1362)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1170)
	at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:161)
	at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1687)
	at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:478)
	at java.awt.Container.writeObject(Container.java:3681)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1362)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1170)
	at java.io.ObjectOutputStream.access$300(ObjectOutputStream.java:161)
	at java.io.ObjectOutputStream$PutFieldImpl.writeFields(ObjectOutputStream.java:1687)
	at java.io.ObjectOutputStream.writeFields(ObjectOutputStream.java:478)
	at java.awt.Container.writeObject(Container.java:3681)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at java.awt.AWTEventMulticaster.saveInternal(AWTEventMulticaster.java:933)
	at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:942)
	at java.awt.Component.writeObject(Component.java:8645)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:975)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1480)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1528)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1493)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1416)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:346)
	at serwerwiadomosci.MainForm.RozeslijWiadomosc(MainForm.java:148)
	at serwerwiadomosci.MainForm.PrzyciskWyslijActionPerformed(MainForm.java:137)
	at serwerwiadomosci.MainForm.access$100(MainForm.java:30)
	at serwerwiadomosci.MainForm$2.actionPerformed(MainForm.java:81)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:688)
	at java.awt.EventQueue$3.run(EventQueue.java:686)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:702)
	at java.awt.EventQueue$4.run(EventQueue.java:700)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

W razie potrzeby mogę zamieścić więcej kodu programu, ale może będzie ktoś wstępnie określić w czym może tkwić problem.

1

Nie wiem czego nie rozumiesz - twoje obiekty moze i sa serializowalne, ale ktos gdzies probuje przeslac jakis GroupLayout. W sumie to niezla bezczelnosc wklejac tu stacktrace nawet go uprzednio nie przeczytawszy:

java.io.NotSerializableException: org.jdesktop.layout.GroupLayout
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:118
.... dlugo dglugo nic
at serwerwiadomosci.MainForm.RozeslijWiadomosc(MainForm.java:148)
at serwerwiadomosci.MainForm.PrzyciskWyslijActionPerformed(MainForm.java:137)
at serwerwiadomosci.MainForm.access$100(MainForm.java:30)
at serwerwiadomosci.MainForm$2.actionPerformed(MainForm.java:81)

1

Jak to nie wnosi - przeciez widac ze cos probuje serializobac jakis layout. Nie wiesz jak sobie z tym poradzic? Jak juz wszystko zawiedzie, to w IDE daj breakpointa w metodzie writeObject z warunkiem ze argument musi byc typu GridLayout i jak juz tam debugger stanie to w stack trace bedziesz sobie klikajac mogl skakac coraz wyzej i wyzej az dojdziesz do miejsca ktore wykonuje to zle wywolanie. Inaczej bez kodu nikt nie jest w stanie pomoc. W kodzie ktory pokazales nie ma nawet tego GridLayout wiec co sie rzucasz.

0
mućka napisał(a):

Jak to nie wnosi - przeciez widac ze cos probuje serializobac jakis layout. Nie wiesz jak sobie z tym poradzic? Jak juz wszystko zawiedzie, to w IDE daj breakpointa w metodzie writeObject z warunkiem ze argument musi byc typu GridLayout i jak juz tam debugger stanie to w stack trace bedziesz sobie klikajac mogl skakac coraz wyzej i wyzej az dojdziesz do miejsca ktore wykonuje to zle wywolanie. Inaczej bez kodu nikt nie jest w stanie pomoc. W kodzie ktory pokazales nie ma nawet tego GridLayout wiec co sie rzucasz.

Mam interfejs graficzny w którym po naciśnięciu buttona jest wywoływana metoda tworząca obiekt i wysyłająca go przez socket.
Nie poznałem jeszcze wszystkiego co wiąże się serializowaniem obiektów ale wygląda na to że przy okazji serializacji tego co chcę wysłać jest serializowane coś co jest powiązane pośrednio z tym obiektem. Dlaczego GroupLayout akurat jest serializowany wraz z obiektem który chcę wysłać, nie mam pojęcia... Może trzeba zastosować transient?

1

Jesli masz klase Message ktora chcesz serializowac i dostajesz wyjatek ze cos jest nieserializowalne w tej klasie, to znam tylko 2 mozliwosci:

  1. masz jakies pole ktore nie jest serializowalne i nie jest transient / static
  2. obiekty maja niejawne pola z typami ktore nie sa serializowalne - np. klasa ktorej obiekt serializujesz jest niestatyczna klasa zagniezdzona lub klasa anonimowa, ktore maja niejawna referencje do otaczajacych ich klas (powiedzmy, ze to sie nazywa $outer).
    Nic innego bez kodu nie da sie powiedziec, dlaczego mi nie wierzysz?
0
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serwerwiadomosci;

import java.io.*;
import java.util.Iterator;
import javax.swing.DefaultListModel;

public class MainForm extends javax.swing.JFrame implements Serializable {
        int [] l;

    static DefaultListModel model = new DefaultListModel();
    /**
     * Creates new form MainForm
     */
    public MainForm() {
        initComponents();
    }
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
        bindingGroup = new org.jdesktop.beansbinding.BindingGroup();

        jScrollPane1 = new javax.swing.JScrollPane();
        odebraneWiadomosci = new javax.swing.JTextArea();
        wiadomosc = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        jListaKlientow = new javax.swing.JList();
        PrzyciskWyslij = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();
        cPopup = new javax.swing.JCheckBox();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        odebraneWiadomosci.setColumns(20);
        odebraneWiadomosci.setRows(5);
        jScrollPane1.setViewportView(odebraneWiadomosci);

        jListaKlientow.setModel(model);

        org.jdesktop.beansbinding.Binding binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, jListaKlientow, org.jdesktop.beansbinding.ObjectProperty.create(), jListaKlientow, org.jdesktop.beansbinding.BeanProperty.create("elements"));
        bindingGroup.addBinding(binding);

        jListaKlientow.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
            public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
                jListaKlientowValueChanged(evt);
            }
        });
        jScrollPane2.setViewportView(jListaKlientow);

        PrzyciskWyslij.setText("Wyslij");
        PrzyciskWyslij.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                PrzyciskWyslijActionPerformed(evt);
            }
        });

        jButton1.setText("Wyślij do...");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        cPopup.setText("Popup");

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(wiadomosc)
                    .add(layout.createSequentialGroup()
                        .add(cPopup)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(jButton1)
                        .add(18, 18, 18)
                        .add(PrzyciskWyslij))
                    .add(layout.createSequentialGroup()
                        .add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 469, Short.MAX_VALUE)
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 164, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                .add(12, 12, 12))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                    .add(jScrollPane1)
                    .add(jScrollPane2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(wiadomosc, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(PrzyciskWyslij)
                    .add(jButton1)
                    .add(cPopup))
                .addContainerGap(12, Short.MAX_VALUE))
        );

        bindingGroup.bind();

        pack();
    }// </editor-fold>                        

    private void PrzyciskWyslijActionPerformed(java.awt.event.ActionEvent evt) {                                               
        RozeslijWiadomosc();
        odebraneWiadomosci.setText(odebraneWiadomosci.getText() + "Wysłano: " + wiadomosc.getText() + "\n");
        wiadomosc.setText("");
    }
        public void RozeslijWiadomosc() {
            Iterator it = SerwerWiadomosci.KlienciArrayList.iterator();
            while(it.hasNext()) {
                try {
                    SerwerWiadomosci.klient k = (SerwerWiadomosci.klient) it.next();            
                    ObjectOutputStream pisarz = (ObjectOutputStream) k.getObjectOutputStream();
                    // message b = new message(wiadomosc.getText(), cPopup.isEnabled());
                    message b = new message("xxx", false);
                    pisarz.writeObject(b);
                    pisarz.close();
                } catch (Exception ex) {
                  ex.printStackTrace();
                }
            }
    }                                              

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    
            for (int i=0; i<l.length; i++) {
                    try {
                        SerwerWiadomosci.klient k = (SerwerWiadomosci.klient) SerwerWiadomosci.KlienciArrayList.get(l[i]);
                        ObjectOutputStream pisarz =  (ObjectOutputStream) k.getObjectOutputStream();
                        message b = new message(wiadomosc.getText(), cPopup.isEnabled());
                        pisarz.writeObject(b);
                        pisarz.close();
                    } catch (Exception ex) { }
        }

    }                                        

    private void jListaKlientowValueChanged(javax.swing.event.ListSelectionEvent evt) {                                            
       l = jListaKlientow.getSelectedIndices();
    }                                           

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(MainForm.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>
        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainForm().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    public static javax.swing.JButton PrzyciskWyslij;
    public static javax.swing.JCheckBox cPopup;
    private javax.swing.JButton jButton1;
    public static javax.swing.JList jListaKlientow;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    public static javax.swing.JTextArea odebraneWiadomosci;
    public static javax.swing.JTextField wiadomosc;
    private org.jdesktop.beansbinding.BindingGroup bindingGroup;
    // End of variables declaration                   


  public class message implements Serializable {
    String message;
    boolean popup;
    public message(String w, boolean p) {
        String message = w;
        boolean popup = p;
    }
    
    public String getMessage() {
        return message;
    }
    public void setMessage(String m) {
        message = m;
    }
    
    public boolean getPopup() {
        return popup;
    }
    public void setPopup(boolean p) {
        popup = p;
    }
    
}  
}

Mam jeszcze jedną klasę w ramach programu ale zamieszczę gdy okaże się, że jest potrzebna.

0

Gosciu, czy mi sie zdaje czy klasa message jest klasa zagniezdzona niestatyczna w klasie MainForm? Jesli dobrze mi sie zdaje to java tworzy niejawna referencje do otaczajacej klasy i probuje ja rowniez serializowac, a ta ma z kolei pole typu BindingGroup ktore ma bog wie co w srodku. Czyli dokladnie to co opisalem wczesniej, tylko nie zrozumiales / nie chciales zrozumiec.

0

@shady, po prostu zrób tak, by klasa Message była całkowicie osobną klasą, a nie wewnątrz klasy MainForm.

0

tak zrobiłem, teraz klasa message jest całkowicie osobna, jednak nadal coś jest nie tak. Teraz już nie mam błędów ale w momencie wysłania obiektu do klienta - klient zostaje rozłączony. Próbuję dojść do tego dlaczego nie mam nigdzie żadnej informacji o błędzie...

1

Informacji o bledzie moze nie ma dlatego:

 } catch (Exception ex) { }

??

0

Błędu brak po stronie serwera bo obiekt został wysłany.
Problem mam teraz po drugiej stronie. Dostałem komunikat: java.lang.ClassNotFoundException: serwerwiadomosci.message
Skąd się wzięło to "serwerwiadomosci"
Obiekt odczytuje w taki sposób.

message m = (message) czytelnikStrm.readObject();
odebraneWiadomosci.append(m.getMessage());
0

No gosciu nie zalamuj mnie. serverwiadomosci to twoj pakiet gdzie ladujesz klasy ktore tu wkleiles... Jak serializujesz to leci obiekt a w tym i pelna nazwa klasy z pakietem, przy wczytywaniu szukana jest w classpath klasa o tej samej nazwie (dochodzi do tego wersjonowanie ale tym sie zajmij jak juz wyjdziesz z przedszkola)... Wez przeczytaj sobie jakis podstawowy tutorial na ten temat i dopiero probuj pisac aplikacje.

0

Mozna. A mozna podpowiedziec zebys przeczytal cos i nie zgadywal do konca zycia. To wyjdzie ci tylko na dobre.

0

Zeby bylo smieszniej Niemcy maja identyczne powiedzonko: mich trifft der Schlag, czyli doslownie ;d

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