How to serialize / deserialize an slicing object by OutputStream / InputStream?

bglmmzbglmmz Joey LvOrganization: PersonalProject: CA systemMember

ENV
ICE: 3.7.1
JDK: 10.0
WINDOWS 10

I want to use OutputStream / InputStream for serialize / deserialize purpose, but I get the NullPointerException.

The slice:

[["java:package:com.joey.slice"]]
module test {
    ["java:getset"]
    class TestMessage {
        int id;
        string sender;
        string receiver;
        string data;
    };
};

The test code:

public class IceTest {
    public static void main(String[] args){

        TestMessage testMessage = new TestMessage();
        testMessage.setId(1);
        testMessage.setSender("Bob");
        testMessage.setReceiver("Alice");
        testMessage.setData("hello");

        com.zeroc.Ice.OutputStream out = new com.zeroc.Ice.OutputStream();
        out.startEncapsulation();
        out.writeValue(testMessage);
        out.endEncapsulation();

        com.zeroc.Ice.InputStream in = new com.zeroc.Ice.InputStream(out.finished());
        TestMessage message = new TestMessage();
        message._iceRead(in);

        System.out.println("id:::" + JSON.toJSONString(message));
    }
}

The exception:
Exception in thread "main" java.lang.NullPointerException
at com.zeroc.Ice.InputStream.startValue(InputStream.java:511)
at com.zeroc.Ice.Value._iceRead(Value.java:90)

So, what's wrong in the test code? what is the right way to get the serialize / deserialize purpose?

Thanks

Best Answers

  • benoitbenoit Rennes, FranceBenoit FoucherOrganization: ZeroC, Inc.Project: Ice ZeroC Staff
    Accepted Answer

    Hi,

    You shouldn't use "internal" methods that start with an underscore such as _iceRead.

    Instead, use the following:

            com.zeroc.Ice.InputStream in = new com.zeroc.Ice.InputStream(out.finished());
            in.startEncapsulation();
            final TestMessage[] tmp = new TestMessage[1];
            in.readValue(value -> tmp[0] = value, TestMessage.class);
            in.endEncapsulation();
            TestMessage message = tmp[0];
    

    Cheers,
    Benoit.

  • bglmmzbglmmz Joey LvOrganization: PersonalProject: CA system
    Accepted Answer

    hi,
    I just solved this problem like this:
    public class IceTest {
    public static void main(String[] args){

            com.zeroc.Ice.InitializationData initData = new com.zeroc.Ice.InitializationData();
            initData.properties = com.zeroc.Ice.Util.createProperties();
            initData.properties.setProperty("Ice.Default.Package", "com.joey.slice");
            Communicator ic = com.zeroc.Ice.Util.initialize(initData);
    
            TestMessage testMessage = new TestMessage();
            testMessage.setId(1);
            testMessage.setSender("Bob");
            testMessage.setReceiver("Alice");
            testMessage.setData("hello");
    
            com.zeroc.Ice.OutputStream out = new com.zeroc.Ice.OutputStream(ic);
            out.startEncapsulation();
            out.writeValue(testMessage);
            out.endEncapsulation();
    
    
            com.zeroc.Ice.InputStream in = new com.zeroc.Ice.InputStream(ic, out.finished());
            in.setValueFactoryManager( new ValueFactoryManagerI());
            in.startEncapsulation();
            in.readValue( m-> { System.out.println("Message::::: " + m);}, TestMessage.class);
            in.endEncapsulation();
        }
    }
    
  • bglmmzbglmmz Joey LvOrganization: PersonalProject: CA system
    Accepted Answer

    if use Communicator, this line is Unnecessary:

    in.setValueFactoryManager( new ValueFactoryManagerI());

Answers

  • benoitbenoit Rennes, FranceBenoit FoucherOrganization: ZeroC, Inc.Project: IceAdministrators, ZeroC Staff ZeroC Staff
    Accepted Answer

    Hi,

    You shouldn't use "internal" methods that start with an underscore such as _iceRead.

    Instead, use the following:

            com.zeroc.Ice.InputStream in = new com.zeroc.Ice.InputStream(out.finished());
            in.startEncapsulation();
            final TestMessage[] tmp = new TestMessage[1];
            in.readValue(value -> tmp[0] = value, TestMessage.class);
            in.endEncapsulation();
            TestMessage message = tmp[0];
    

    Cheers,
    Benoit.

  • bglmmzbglmmz Joey LvOrganization: PersonalProject: CA systemMember
    Accepted Answer

    hi,
    I just solved this problem like this:
    public class IceTest {
    public static void main(String[] args){

            com.zeroc.Ice.InitializationData initData = new com.zeroc.Ice.InitializationData();
            initData.properties = com.zeroc.Ice.Util.createProperties();
            initData.properties.setProperty("Ice.Default.Package", "com.joey.slice");
            Communicator ic = com.zeroc.Ice.Util.initialize(initData);
    
            TestMessage testMessage = new TestMessage();
            testMessage.setId(1);
            testMessage.setSender("Bob");
            testMessage.setReceiver("Alice");
            testMessage.setData("hello");
    
            com.zeroc.Ice.OutputStream out = new com.zeroc.Ice.OutputStream(ic);
            out.startEncapsulation();
            out.writeValue(testMessage);
            out.endEncapsulation();
    
    
            com.zeroc.Ice.InputStream in = new com.zeroc.Ice.InputStream(ic, out.finished());
            in.setValueFactoryManager( new ValueFactoryManagerI());
            in.startEncapsulation();
            in.readValue( m-> { System.out.println("Message::::: " + m);}, TestMessage.class);
            in.endEncapsulation();
        }
    }
    
  • bglmmzbglmmz Joey LvOrganization: PersonalProject: CA systemMember
    Accepted Answer

    if use Communicator, this line is Unnecessary:

    in.setValueFactoryManager( new ValueFactoryManagerI());

Sign In or Register to comment.