Сериализация / десериализация Java-объекта через сеть и байтовый массив

У меня есть этот код из DZone ( http://www.dzone.com/links/r/java_custom_serialization_example.html), который сериализует / десериализует объект Java из / в файл.

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());
    }
}

Как я могу передать сериализованный объект, используя сокет Java? А также как я могу сохранить сериализованный / десериализованный объект в / из байтового массива.

4 ответа

Решение

Это код для сериализации в / из байтового массива. Я получил подсказки от - Сериализуемый Java-объект в байтовый массив

@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());
}

Как я могу передать сериализованный объект, используя сокет Java?

Оберните его выходной поток в ObjectOutputStream,

А также как я могу сохранить сериализованный / десериализованный объект в / из строки.

Вы не Сериализованные объекты являются двоичными и должны храниться в байтовых массивах. Десериализованный объект - это сам объект, а не строка.

Тебе не нужны те readObject() а также writeObject() методы. Они не делают ничего, что не произошло бы по умолчанию.

Это код, который работает, и я получил подсказку от http://cyberasylum.janithw.com/object-serialization-over-networks-in-java/.

@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)
    {
        // when error, try again
        Thread.sleep(500);
        s = new Socket(serverAddress, 9092);
    }

    // send the object over the network
    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();
        }
    }
}

Подобно тому, как вы завершили свой файловый поток классом objectstream, вы делаете то же самое с сокетами. Вы не должны "хранить" сериализованный объект в строку.

Другие вопросы по тегам