5 Stimmen

Serialisieren/Deserialisieren eines Java-Objekts über Netzwerk und Byte-Array

Ich habe diesen Code von DZone (http://www.dzone.com/links/r/java_custom_serialization_example.html), der Java-Objekte von/zu einer Datei serialisiert/deserialisiert.

final class Hello implements Serializable
{
    int x = 10;
    int y = 20;

    public int getX()
    {
        return x;
    }
    public int getY()
    {
        return y;
    }
}

public class SerializedComTest {

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }

    @Test
    public void testFile() throws IOException, ClassNotFoundException {
        Hello h = new Hello();
        FileOutputStream bs = new FileOutputStream("hello.txt"); // ("testfile");
        ObjectOutputStream out = new ObjectOutputStream(bs);
        out.writeObject(h);
        out.flush();
        out.close();

        Hello h2;
        FileInputStream fis = new FileInputStream("hello.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        h2 = (Hello) ois.readObject();

        assertTrue(10 == h2.getX());
        assertTrue(20 == h2.getY());
    }
}

Wie kann ich ein serialisiertes Objekt using Java Socket übertragen? Und wie kann ich das serialisierte/deserialisierte Objekt in/einen Byte-Array speichern/aus einem Byte-Array lesen.

13voto

prosseek Punkte 167667

Dies ist der Code für die Serialisierung zu/von einem Byte-Array. Ich habe Hinweise von - Java Serializable Object to Byte Array erhalten.

@Test
public void testByteArray() throws IOException, ClassNotFoundException, InterruptedException {
    Hello h = new Hello();

    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutput out = new ObjectOutputStream(bos);
    out.writeObject(h);
    byte b[] = bos.toByteArray();
    out.close();
    bos.close();

    Hello h2;
    ByteArrayInputStream bis = new ByteArrayInputStream(b);
    ObjectInput in = new ObjectInputStream(bis);
    h2 = (Hello) in.readObject();

    assertTrue(10 == h2.getX());
    assertTrue(20 == h2.getY());
}

1voto

user207421 Punkte 297318

Wie kann ich ein serialisiertes Objekt mit Java Socket übertragen?

Wickeln Sie seinen Ausgabestrom in ein ObjectOutputStream ein.

Und wie kann ich das serialisierte/deserialisierte Objekt auch in/einen String speichern?

Das machen Sie nicht. Serialisierte Objekte sind binär und sollten in Byte-Arrays gespeichert werden. Ein deserialisiertes Objekt ist das Objekt selbst, kein String.

Sie benötigen nicht diese Methoden readObject() und writeObject(). Sie tun nichts, was nicht standardmäßig passieren würde.

0voto

wtfmoments Punkte 16

Wie Sie Ihren Dateistream mit der Objectstream-Klasse umwickeln, tun Sie dasselbe mit Sockets. Sie sollten nicht ein serialisiertes Objekt in einem String "speichern".

0voto

prosseek Punkte 167667

Dies ist der Code, der funktioniert, und ich habe den Hinweis von http://cyberasylum.janithw.com/object-serialization-over-networks-in-java/ bekommen.

@Test(timeout = 2000)
public void testStream() throws IOException, ClassNotFoundException, InterruptedException {
    PingerThread pinger = new PingerThread(9092);
    pinger.start();

    String serverAddress = "localhost";
    Socket s;
    PrintWriter output;
    BufferedReader input;
    try {
        // Client
        s = new Socket(serverAddress, 9092);
    }
    catch (IOException e)
    {
        // bei Fehler erneut versuchen
        Thread.sleep(500);
        s = new Socket(serverAddress, 9092);
    }

    // Das Objekt über das Netzwerk senden
    Hello h = new Hello();

    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
    out.writeObject(h);
    out.flush();

    ObjectInputStream in = new ObjectInputStream(s.getInputStream());
    System.out.println("2");
    Hello h2;
    h2 = (Hello) in.readObject();

    assertTrue(10 == h2.getX());
    assertTrue(20 == h2.getY());
}

private class PingerThread extends Thread {
    public int portNumber;

    public PingerThread(int portNumber) {
        super();
        this.portNumber = portNumber;
    }

    @Override
    public void run() {
        try {
            ServerSocket listener = new ServerSocket(this.portNumber);
            Socket socket = listener.accept();

            ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());

            Hello h;

            while((h = (Hello) in.readObject()) != null) {
                System.out.println("1");
                //h = (Hello) in.readObject();
                System.out.println(h.getX());
                System.out.println(h.getY());

                out.writeObject(h);
                out.flush();
            }

            System.out.println("OUT");
            socket.close();
            listener.close();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X