powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI error unmarshalling return; NotSerializableException
17 сообщений из 17, страница 1 из 1
RMI error unmarshalling return; NotSerializableException
    #39122860
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустил серверную часть RMI.
Сделал клиента (куда прописал сам вызов и интерфейс как заглушку).

Если запускать клиент на одной и той же машине, где работает серверная часть, все нормально работает.

Если пытаться достучаться с другой машины, падает на:
Код: java
1.
MyRequest c = (MyRequest) Naming.lookup("rmi://111.111.111.111:2099/RemoteService");


(адрес, порт верные (хотя здесь адрес приведен условно), имя сервиса тоже ну и вообще разница только в том, что запуск с другой машины)
Ошибка:
Код: java
1.
2.
3.
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: org.tst.rmi.RemoteServiceImpl
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)



Есть версия, что надо все-таки на другой машине как-то подтянуть заглушку?
Ну вроде сделал stub, положил этот класс в классы клиентского проекта, но ничего не изменилось, может в проекте нетбинза надо еще как-то явно прицепить эту заглушку к проекту, если вообще в этом дело?
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39122880
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Код: java
1.
2.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new org.tst.rmi.RemoteServiceImpl());
registry.rebind("TestService", rsstub);
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39122911
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD , изначально "сервер" так и пытался делать, но не вышло - сейчас например если так написать, ругается
Код: java
1.
2.
Exception in thread "main" java.lang.SecurityException: sealing violation: package org.tst.rmi is sealed
	at java.net.URLClassLoader.getAndVerifyPackage(URLClassLoader.java:388)


Поэтому в итоге написал без UnicastRemoteObject.exportObject, просто rebind new RemoteServiceImpl, но видимо, все-таки надо exportObject - это наверно, как выставить наружу скелет класса на приемнике.
По sealing violation нашел только такое
Прописал в манифест проекта в нетбинзе:
Name: org.tst.rmi
Sealed: false
Ошибка осталась.
Где-то еще встречал вариант с неким SecurityManagerom, может оно, но не найду теперь.
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39122924
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишут еще:
A sealing violation means that some classes from a sealed package were loaded from two different locations (directories or jar files).

A sealed package is one that essentially says "I know that all classes in this package come from a single jar file. For security reason no other location may provide classes that are in this package".

Chances are you have two Oracle JDBC driver jars in your classpath

Что-то вроде все классы в пакете должны быть из одного jar-а, но суть все равно не ясна. При чем тут безопасность, мы ж берем вполне конкретный класс проекта? :/
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39122964
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Чтобы запретить доступ к членам класс у которых доступ на уровне пакета, для этого sealed и нужен. Кто-то написал класс
pkg1.Clazz{static int i;}, а поместив свой класс в пакет pkg1 вы уже имеет доступ к i, а с sealed=true уже нельзя.
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123019
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Кинь под спойлер весь исходный код.
2.
Что про секьюрити менеджер говорит в туториале:

https://docs.oracle.com/javase/tutorial/rmi/implementing.html

Creating and Installing a Security Manager

The main method's first task is to create and install a security manager, which protects access to system resources from untrusted downloaded code running within the Java virtual machine. A security manager determines whether downloaded code has access to the local file system or can perform any other privileged operations.

If an RMI program does not install a security manager, RMI will not download classes (other than from the local class path) for objects received as arguments or return values of remote method invocations. This restriction ensures that the operations performed by downloaded code are subject to a security policy.

Here's the code that creates and installs a security manager:

if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123056
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы запретить доступ к членам класса, у которых доступ на уровне пакета
Т.е. в пакет входит кучка классов с методами объявленными как: public со static и просто.
Нам надо выставить для пакета sealed=true, чтобы если кто-то как-то добавит в наш пакет свой класс, у него бы не было возможности достать public-методы классов, которые уже были там ранее?
Механизм не понятен пока, но как в нетбинзе выставить этот sealed=true? Руками в манифесте?
Пробовал прописать в manifest.mf проекта:
Name: org\tst\rmi\
Sealed: true
не решило. Или надо создать отдельный файл в src проекта?
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123077
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Я про publiс ничего не говорил, только про protected и без модификатора.
Дайте код и как разбито по проектам.
В одном месте Name: org.tst.rmi, в другом Name: org\tst\rmi\, но кажется должно быть Name: org/tst/rmi/ и Sealed: false
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123078
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЧто про секьюрити менеджер говорит в туториале
Спасибо. Попробовал запустить, как описано там в примере, просто дописав:
Код: java
1.
2.
3.
if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }


В итоге получилась процедура регистрации:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...  {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new SecurityManager());
        }

        Registry registry = LocateRegistry.createRegistry(2099);
        
        RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl(), 1);
        registry.rebind(SERVICE_NAME, rsstub);
        System.out.println("Service started.");
}


И теперь ошибка другая на той же строке:
Код: java
1.
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1" "listen,resolve")


Нужно еще давать права какие-то? Ничего не ясно. Как вообще работал тогда "клиент", кот. запускался на этой же машине )
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123097
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, туплю.
Код: java
1.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl(), 1);


Просто:
Код: java
1.
RemoteService rsstub = (RemoteService) UnicastRemoteObject.exportObject(new RemoteServiceImpl());



Запустился.

Но теперь при запросе с клиента тоже ругается на java.net.SocketPermission
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123116
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS...И теперь ошибка другая на той же строке
на следующей, на rebind.
У меня так же. т.ч. я тоже без сеьюрити

Сейчас сам с RMI занимаюсь... До этого на одной машинке игрался, сейчас пытаюсь на Amazon EC2 порты для RMI в I-net открыть, пока не получается (((
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123123
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev , теперь убрал из кода запуска "сервера" инициализацию SecurityManager и теперь тоже нормально запускается, уже не ругаясь package org.tst.rmi is sealed и на клиенте на пемишн теперь тоже не ругается, теперь ругается на заглушку или что там еще:
Код: java
1.
Exception in thread "main" java.lang.AbstractMethodError: org.tst.rmi.RemoteServiceImpl_Stub.runTask(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;


Т.е. ругается уже на вызов метода, коннект прошел.
Про SecurityManager так и не ясно что это было.
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123179
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробился через Internet... полет нормальный. Без секьюрити. Никаких ошибок. Что на одном хосте, что на разных.

Как пробивался:
1. Открыл порт для RMI регистри (у меня 7000) и порты для RMI классов-серверов (у меня 7001-....) для доступа извне через Amazon EC2 Console
2. Т.к. на сервере у Amazon EC2 два IP адреса:
внутренний (собственно адрес сервера)
внешний статический IP адрес Amazon Elastic IPs
То, что бы клиент правильно лез на внешний IP адрес, пришлось сделать финт ушами и создать классы ServerSocketFactory (просто заглушка) и ClientSocketFactory.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.io.IOException;
import java.io.Serializable;
import java.net.Socket;
import java.rmi.server.RMIClientSocketFactory;

public class ClientSocketFactory implements RMIClientSocketFactory, Serializable {

	@Override
	public Socket createSocket(String host, int port) throws IOException {
		// TODO Auto-generated method stub
		System.out.println( "ClientSocketFactory host="+host+" port="+port );		
		System.out.println( "Rewrite host to <my external ip censored>" );
		host = "<my external ip censored>";
		return new Socket( host, port );
	}
}



3. Создаю личную registry и регистрирую класс в ней

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	public void register() throws RemoteException, AlreadyBoundException {
		ServerSocketFactory ssf;
		ClientSocketFactory csf;
		ssf = new ServerSocketFactory ();
		csf = new ClientSocketFactory();
		I_GF_Host stub = (I_GF_Host)UnicastRemoteObject.exportObject(
			this, 
			DISPATCHER_REGISTER_PORT+1,
			csf,
			ssf
			);
		
		Registry registry = LocateRegistry.createRegistry( DISPATCHER_REGISTER_PORT );
		registry.bind( "I_GF_Host", stub );
	}



4. Получаю его на клиенте

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
System.out.println( "Connect to "+ DISPATCHER_REGISTER_PORT);	            
	            Registry registry = LocateRegistry.getRegistry(
"<my external IP censored>",
DISPATCHER_REGISTER_PORT
);
System.out.println( "getRegistry OK");	            
	            I_GF_Host host = (I_GF_Host) registry.lookup( "I_GF_Host" );
System.out.println( "lookup OK");	            
	            host.test();
System.out.println( "Test OK" );
	            //
	            RD_Request rd;
	            RD_RequestPacket packet;
	            packet = new RD_RequestPacket();
	            packet.arr = new RD_Request[3];
	            packet.arr[ 0 ] = new RD_Request();
	            packet.arr[ 1 ] = new RD_Request();
	            packet.arr[ 2 ] = new RD_Request();
	            
	            packet.arr[ 0 ].request = "Request 1...";
	            packet.arr[ 1 ].request = "Request 2...";
	            packet.arr[ 2 ].request = "Request 3...";
	            host.doRequests( packet );
	            System.out.println( "doRequests OK" );




И все работает. Никаких секьюрити менеджеров
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123188
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSjava.io.NotSerializableException

Ты уверен, что у тебя все классы которые ты передаешь в remote объявлены как:

class MyClass implements java.io.Serializable {
...
}

Ошибка выглядит совершенно банальной: не смог сделать marshal'инг объекта, т.к. он NotSerializable.
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123207
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если есть не null ссылка на объект (если null то ошибок нет) и класс объекта не Serializable, то получаю ошибку:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
	java.io.NotSerializableException: <MY CLASS NAME>
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:158)
	at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
	at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
	at com.sun.proxy.$Proxy0.doRequests(Unknown Source)
        <censored>
Caused by: java.io.NotSerializableException: <MY CLASS NAME>
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1378)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1174)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
	at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:294)
	at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:153)
	... 4 more


...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123429
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev , это читал и изначально сделал класс с имплементом Serializable.
В конечном итоге все получилось (опять))), когда по-человечески сгенерил заглушку с помощью rmic,
указал -classpath и -d (куда класть).
Потом получившиеся класс *Impl, интерфес и заглушки положил в классы проекта клиента на другой машине и все пошло.
Возможно, дело в том, что ранее до меня rmic-ом была сгенерирована заглушка класса того же имени, что создал я, поэтому когда генерил заглушку почему-то подхватывался старый класс. В общем темные пятна еще остались, но немного лучше )
Надо теперь научиться как в нетбинзе несколько классов проекта засунуть в отдельный Jar, если это вообще реально )
...
Рейтинг: 0 / 0
RMI error unmarshalling return; NotSerializableException
    #39123485
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я заглушки не генерю (и генерить не буду). Мне RMI нужен просто как связь между различными JVM (в дальнейшем серверами). Т.ч. все классы проекта будут доступны на всех машинах - не жалко )))
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / RMI error unmarshalling return; NotSerializableException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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