Как заново сериализовать объект

237
20 марта 2017, 07:46

Вот небольшой пример кода, сильно упрощённый:

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * Part of project: SerializationTest.
 * Created by Maksim on 19.03.2017.
*/
public class Main {
    public static void main(String[] args) {
        if(args.length == 1) {
            try(Socket socket = new Socket("127.0.0.1", 9876);
                ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
                Test test = (Test) objectInputStream.readObject();
                System.out.println(test.getA());
                test = (Test) objectInputStream.readObject();
                System.out.println(test.getA());
            } catch (IOException | ClassNotFoundException e) {
                e.printStackTrace();
            }
        } else {
            try (ServerSocket serverSocket = new ServerSocket(9876);
                 Socket socket = serverSocket.accept();
                 ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream())) {
                Test test = new Test(10);
                objectOutputStream.writeObject(test);
                objectOutputStream.flush();
                test.setA(110);
                objectOutputStream.writeObject(test);
                objectOutputStream.flush();
            } catch(IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }
}

Это клиент-сервер. Вот сам класс Test:

import java.io.Serializable;
/**
 * Part of project: SerializationTest.
 * Created by Maksim on 19.03.2017.
 */
public class Test implements Serializable{
    private int a;
    public Test() {
    }
    public Test(int a) {
        this.a = a;
    }
    public int getA() {
        return a;
    }
    public void setA(int a) {
        this.a = a;
    }
}

Вывод на консоль:

10

10

Как сделать так, чтобы выводилось:

10

110

Мне надо это для экономии памяти, чтобы использовать один класс обёртку для передачи данных. Возможно ли это?

Answer 1

Для этого можно воспользоваться методом reset класса ObjectOutputStream:

test.setA(110);
objectOutputStream.reset();
objectOutputStream.writeObject(test);
READ ALSO
Как передать сообщение (через Handler) из EditText.onSelectionChanged в Activity

Как передать сообщение (через Handler) из EditText.onSelectionChanged в Activity

ПриветУ меня есть класс, наследованный от EditText c обработчиком выделения текста

239
PreparedStatement и defaul value в jdbc Spring

PreparedStatement и defaul value в jdbc Spring

Подскажите, пожалуйста, создаю PreparedStatement c запросом на вставку в PostgreSQLВ таблице есть поле created (с типом TimestampTZ)

231
Что выбрать: Appodeal или Admob?

Что выбрать: Appodeal или Admob?

Добрый день всем! На сегодняшний день интересует вопрос: какая сеть приносит больше дохода и какая сеть более стабильная? То, что appodeal выводит...

584
Как создать копию View чтобы уменьшить код?

Как создать копию View чтобы уменьшить код?

Если присмотреться, то 2 объекта класса EditText почти одинаковыеМожно ли как-то создать копию 2 из 1, а после уже исправить значения

198