2015-09-11 1 views
2

Я работаю над проектом RMI, который имеет два отдельных проекта для клиента и сервера. Я использовал start rmiregistry. Когда я пытаюсь запустить приложение «Сервер», я получаю исключение.RMI exception "error marshalling arguments"

public class Runner extends UnicastRemoteObject { 

    public Runner() throws RemoteException { 
     try { 
      ServerOperations so = new ServerSide(); 
      Naming.rebind("rmi://localhost:2000/MiveCoffeeService", so); 
      System.out.println("Server is online."); 

     } catch (RemoteException | MalformedURLException | FileNotFoundException ex) { 
      Logger.getLogger(Runner.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static void main(String[] args) throws RemoteException { 
     new Runner(); 
    } 

} 

Исключения:

Sep 11, 2015 9:05:51 PM ir.nscogroup.coffeemive.Runner <init> 
SEVERE: null 
java.rmi.MarshalException: error marshalling arguments; nested exception is: 
    java.io.NotSerializableException: dataaccess.ServerSide 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:177) 
    at ir.nscogroup.coffeemive.Runner.<init>(Runner.java:29) 
    at ir.nscogroup.coffeemive.Runner.main(Runner.java:38) 
Caused by: java.io.NotSerializableException: dataaccess.ServerSide 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) 
    ... 4 more 

Что не так?

ответ

0

спасибо, ребята. этот образец решил мою проблему.

package com.javacodegeeks.core.rmi.rminterface; 

public class Configuration { 

    public static final int REMOTE_PORT = 8888; 
    public static final String REMOTE_ID = "RMI_EXAMPLE"; 
    public static final String REMOTE_HOST = "localhost"; 

} 


package com.javacodegeeks.core.rmi.remoteserver; 

import java.rmi.AlreadyBoundException; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 

import com.javacodegeeks.core.rmi.rminterface.Configuration; 

public class RemoteServer { 

    public static void main(String[] args) throws RemoteException, AlreadyBoundException { 

     RMIImplementation rmiImplementation = new RMIImplementation(); 
     Registry registry = LocateRegistry.createRegistry(Configuration.REMOTE_PORT); 
     registry.bind(Configuration.REMOTE_ID, rmiImplementation); 
    } 
} 
+0

Этот пример не имеет ничего общего с вашей проблемой. Это не существенно отличается от того, что вы уже опубликовали. – EJP

4

StackTrace исключения говорит вам точно что не так:

java.io.NotSerializableException: dataaccess.ServerSide 

Вы пытаетесь сериализации несериализуемого класса, dataaccess.ServerSide. Решение. Сделайте свой класс и все необходимые составные классы интерфейсом Serializable.

+1

Следует также отметить, что если некоторые переменные экземпляра сериализуемого объекта не могут или не должны быть сериализованы, они должны быть помечены ключевыми словами переходного процесса –

2

Проблема здесь состоит в том, что ServerSide не является ни экспортировали удаленный объект и не Serializable. Почти наверняка вы хотели бывший, так что вы должны либо:

  • сделать его продлить UnicastRemoteObject или
  • экспортировать его вручную перед привязкой, через UnicastRemoteObject.exportObject().

NB не оба.