I'm trying to create an ObjectInputStream from a BufferedInputStream created from a socket's inputstream. When I initialize the variable, it throws the StreamCorruptedException due to an invalid stream header. I tried searching and other solutions said that it was due to using different kinds of stream readers. In my code, all my Object I/O Streams use the same format.
Main:
public static void main(String[] args) {
    Server server = new Server("Room", "Server");
    Client client = new Client("Client", "localhost");
    server.start();
    client.start();
    Message m = new Message();
    m.addValue("Message", "Dummy Text");
    client.transmit(m);
}
Server listener :
    private void startServerListener() {
    while (true) {
        try {
            ObjectOutputStream writer;
            ObjectInputStream reader = new ObjectInputStream(
                    new BufferedInputStream(socket.getInputStream())); // Exception points here
            Message msg = (Message) reader.readObject();
            System.out.println(3);
            if (msg.hasValue("Username")) {
                System.out.println(4);
                this.username = msg.getValue("Username");
                msg.remove("Username");
                Message tmp_msg = new Message();
                tmp_msg.addValue("Raw Message", username + " has joined");
                for (Listener l : Server.clients) {
                    Socket socket = l.getSocket();
                    writer = new ObjectOutputStream(
                            new BufferedOutputStream(
                                    socket.getOutputStream()));
                    writer.writeObject(tmp_msg);
                    writer.flush();
                }
            }
            if (msg.hasValue("Message")) {
                System.out.println(5);
                for (Listener l : Server.clients) {
                    Socket socket = l.getSocket();
                    writer = new ObjectOutputStream(
                            new BufferedOutputStream(
                                    socket.getOutputStream()));
                    writer.writeObject(msg.getValue("Message"));
                    writer.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Client that sends the data :
private String username, ip;
private ObjectOutputStream writer;
public Socket socket;
public Client(String username, String ip) {
    this.username = username;
    this.ip = ip;
}
@Override
public synchronized void run() {
    try {
        socket = new Socket(ip, 22600);
        writer = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream()));
        Message msg = new Message();
        msg.addValue("Username", username);
        writer.writeObject(msg);
        writer.flush();
        Listener listener = new Listener(socket, Client.class);
        System.out.println(0);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public synchronized void transmit(Message msg) {
    try {
        System.out.println("a");
        System.out.println(1);
        writer.writeObject(msg);
        writer.flush();
        System.out.println(2);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Stack trace :
java.io.StreamCorruptedException: invalid stream header: 7371007E
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at com.Listener.startServerListener(Listener.java:89)
at com.Listener.access$1(Listener.java:82)
at com.Listener$2.run(Listener.java:37)
at java.lang.Thread.run(Unknown Source)