Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ObjectOutputStream - NotSerializableException??? / 6 сообщений из 6, страница 1 из 1
10.05.2012, 14:39:58
    #37787906
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
Здравствуйте, вот такая беда у меня, копался чуток в инете, есть темы похожие, но мне не получается.
Вот здесь есть похожее http://cloud-cuckoo.com.ua/content/java-serializatsiya-rabota-s-objectoutputstream-objectinputstream

Кто сталкивался подскажите пож!!!

Пробую сделать многопоточный сервер. Пока все получается, но мне нужно передать на клиенты объект через который они будут общаться.
При попытке передачи такого объекта, я получаю NotSerializableException - что нужно сериализировать, зачем? Спасибо!

Код: sql
1.
this.oOutputStream.writeObject(sendOutputStreamObject);


Клиент посылает название сервера главному серверу.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class CHClient{

	private String serverName;
	private final int PORT = 8888;

	private ObjectInputStream oInputStream;
	private ObjectOutputStream oOutputStream;

	public CHClient(String serverName) throws IOException {

		this.serverName = serverName;

		Object[] inputStreamObject = null;
		String oInputStreamParam1;
		Object[] outputStreamObject = { this.serverName };

		InetAddress addr = InetAddress.getByName(null);
		System.out.println("addr = " + addr);
		Socket socket = new Socket(addr, PORT);
		try {
			System.out.println("socket = " + socket);

				this.oOutputStream = new ObjectOutputStream(socket.getOutputStream());
				this.oOutputStream.writeObject(outputStreamObject);

				this.oInputStream = new ObjectInputStream(socket.getInputStream());

				inputStreamObject = (Object[]) this.oInputStream.readObject();

				oInputStreamParam1 = inputStreamObject[0].toString();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			System.out.println("closing...");
			socket.close();
		}
	}
}


Сервер смотрит если сервера с таким именем еще нет - создает и возвращает объект(должен возвращать), Все работает, но как только суну в Стрим объект типа ChessMultiServerThread - вылетает NotSerializableException!
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ChessServer {
	private static final int PORT = 8888;
	private Socket socket;

	private ServerSocket serverSocket = null;
	private ArrayList<String> servers = new ArrayList<String>();
	private boolean isServerExist;

	private ObjectInputStream oInputStream;
	private ObjectOutputStream oOutputStream;

	public static void main(String[] args) throws IOException {

		new ChessServer();
	}

	public ChessServer() {
		Object[] inputStreamObject;
		Object outputStreamServerNameObj = null;
		Object outputStreamChMultiServObj = null;
		String oInputStreamParam1;

		System.out.println("Server Started");

		try {
			serverSocket = new ServerSocket(PORT);
			do {
				this.socket = serverSocket.accept();
				this.oInputStream = new ObjectInputStream(socket.getInputStream());

				inputStreamObject = (Object[]) this.oInputStream.readObject();
				this.oOutputStream = new ObjectOutputStream(socket.getOutputStream());
				oInputStreamParam1 = inputStreamObject[0].toString();

				isServerExist = isServerExist(oInputStreamParam1);

				if (!isServerExist) {
					ChessMultiServerThread serverOne = new ChessMultiServerThread(socket);
					outputStreamServerNameObj = new String("newServer");
					outputStreamChMultiServObj = serverOne;
				} else {
					outputStreamServerNameObj = new String("serverExist");
				}

				Object[] sendOutputStreamObject = { outputStreamServerNameObj, outputStreamChMultiServObj };
				this.oOutputStream.writeObject(sendOutputStreamObject);

			} while (true);

		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				this.serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private boolean isServerExist(String serverName) {

		boolean isExist = this.servers.contains(serverName);
		System.out.println("isExist: " + isExist);
		System.out.println("serverName: " + serverName);
		if (isExist) {
			return true;
		} else {
			this.servers.add(serverName);
			return false;
		}
	}
}



Сервер для коммуникации между клиентами.(Только набросок - логика еще не зашита)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
import java.io.*;
import java.net.Socket;

public class ChessMultiServerThread extends Thread{

	private Socket socket;
	private BufferedReader in;
	private PrintWriter out;


	public ChessMultiServerThread(Socket s) throws IOException {
		socket = s;
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
		start();
	}

	@Override
	public void run() {
		try {
			// while (true) {
			String str = in.readLine();
			// System.out.println("Echoing: " + str);
			out.println(str);
			// }
		} catch (IOException e) {
			System.err.println("IO Exception");
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				System.err.println("Socket not closed");
			}
		}
	}

}
...
Рейтинг: 0 / 0
10.05.2012, 14:51:45
    #37787935
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
_webdev_Сервер смотрит если сервера с таким именем еще нет - создает и возвращает объект(должен возвращать), Все работает, но как только суну в Стрим объект типа ChessMultiServerThread - вылетает NotSerializableException!

Во-первых есть такой интерфейс Serializable. Стоит почитать про что он.
Во-вторых сериализация нужна чтобы передать данные. Ваш ChessMultiServerThread никаких особых данных не содержит. Зачем вы его пытаетесь сериализовать? Там внутри ничего похожего на Serializable классы нет. Ни Thread, ни Socket, ни потоки IO. Это всё классы поведения, сильно завязаные на текущую систему. Их нельзя сериализовать и полностью восстановить из данных.
...
Рейтинг: 0 / 0
10.05.2012, 18:03:45
    #37788287
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
Ну это понятное дело, что я первым делом попробовал сделать передаваемый класс "implements Serializible", не идет.
Тут мне подсказали, что "Thread" сериализировать неззя.
Вопрос следующий, я если я уберу "extends Thread" - я смогу работать с этим объектом как с посредником между двумя клиентами? Тоисть если я передам обоим клиентам этот же объект по идее они должны через него общаться?
Спасибо.
BlazkowiczВаш ChessMultiServerThread никаких особых данных не содержит.Я же написал, что там еще никакой логики не зашито, это пока набросок.. на понимание правильно ли все работает.
...
Рейтинг: 0 / 0
10.05.2012, 18:08:20
    #37788291
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
По-моему вы заново пытаетесь изобрести RMI
...
Рейтинг: 0 / 0
10.05.2012, 18:09:49
    #37788293
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
BlazkowiczТам внутри ничего похожего на Serializable классы нет. Ни Thread, ни Socket, ни потоки IO.
_webdev_Тут мне подсказали, что "Thread" сериализировать неззя.
Кто же это мог быть?
...
Рейтинг: 0 / 0
14.05.2012, 20:50:33
    #37793846
_webdev_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ObjectOutputStream - NotSerializableException???
авторBlazkowicz Все, понял что глупости писал, копнул поглубже, переделал логику и наконец понял как оно работает. :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / ObjectOutputStream - NotSerializableException??? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]