|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
|
|
Relates :
|
FULL PRODUCT VERSION :
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode)
A DESCRIPTION OF THE PROBLEM :
When Enums are passed over RMI IIOP, they are not serialized/deserialized correctly.
They fail the equals() test. This is quite major.
I have an application that serializes an enumeration across a socket connection. When I read one and do an equals against one of the local Enum objects, it fails. However, enum.name().equals(deserializedEnum.name()) returns true and so does enum.getClass().equals(deserializedEnum.name()).
I am doing an import static com.foo.bar.MyEnum.* when I set my items to be serialized, I don't know if that causes a problem or not.
However, I can't reproduce the error simply. Creating a local ByteArrayOutput/Input streams works ok. This seems to be happening over a socket connection.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
javac EnumIIOPBreakage.java
rmic -classpath . -iiop Server
java -classpath . EnumIIOPBreakage
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
equal? true
classes equal? true
names equal? true
ACTUAL -
equal? false
classes equal? true
names equal? true
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.rmi.*;
import java.util.*;
import javax.rmi.*;
import javax.naming.*;
enum MyEnum { ONE, TWO, THREE };
public class EnumIIOPBreakage
{
public static void main(String[] args)
throws Throwable
{
Hashtable properties = new Hashtable();
properties.put("java.naming.factory.initial",
"com.sun.jndi.cosnaming.CNCtxFactory");
properties.put("java.naming.provider.url", "iiop://localhost:1099");
new Server(properties);
Context context = new InitialContext(properties);
Object ref = context.lookup("server");
RServer server = (RServer) PortableRemoteObject.narrow(ref, RServer.class);
System.out.println("equal? " +
MyEnum.ONE.equals(server.get(MyEnum.ONE.name())));
System.out.println("classes equal? " +
MyEnum.ONE.getClass().equals(
server.get(MyEnum.ONE.name()).getClass()));
System.out.println("names equal? " +
MyEnum.ONE.name().equals(
server.get(MyEnum.ONE.name()).name()));
}
}
class Server
implements RServer
{
public Server(Hashtable properties)
throws Throwable
{
PortableRemoteObject.exportObject(this);
Context context = new InitialContext(properties);
context.rebind("server", this);
}
public MyEnum get(String name)
{
return MyEnum.valueOf(name);
}
}
interface RServer
extends Remote
{
MyEnum get(String name)
throws RemoteException;
}
---------- END SOURCE ----------
###@###.### 2005-05-30 05:28:17 GMT
|