how do i marshal data for TCP streaming?

Cit5 :

So for a homework assignment, I have a example of how to marshal data and unmarshal.

The structure they gave us was this: Event is an interface. Wireformat is a class that "inherits" an Event. WireFormatWidget is a class with the actual code that has the marshal and unmarshal.

I have separate threads that handle the sending data in byte array using TCP.

What I have an issue is that when I create a Wireformat object. I run into issue with a thread trying to marshal the data.

Exception in thread "main" java.lang.NullPointerException
    at myhw.WriteFormatWidget.getBytes(WriteFormatWidget.java:38)

The interface structure defines the data as a message, a type of message as an integer, a timestamp (of what I am assuming is Date and getTime of that date), and a tracker. I am not sure what the tracker is.

I am told this structure is the best method to sending data which is why I am trying to implement this code style.

The WriteFormatWidget consist of this:

private int type;
private long timestamp;
private String identifier;
private int tracker;

So for my wireformat, I created it as a class that extends WireFormatWidget and implements Event because that was the only way Eclipse did not spit an error or suggest changing WireFormatWidget or Event.

Now when I hardcode my specific wireformat, I instantiate it and it seems to not be able to call getBytes() with the hardcoded values I uses for the same variables.

public class MyWireFormat extends WireFormatWidget implements Event {
    private String identifier = "here is my custom wireformat";
    ....

When I print out the identifier in the getBytes in WireFormatWidget, I get null and not the expected identifier I hardcoded. So I must not be "inheriting" appropriately. What am I doing wrong?

EDIT: WireFormatWidget (given)

public class WriteFormatWidget {
private int type;
private long timestamp;
private String identifier;
private int tracker;

    public byte[] getBytes() throws IOException {
        byte[] marshalledBytes = null;
        ByteArrayOutputStream baOutputStream = new ByteArrayOutputStream();
        DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(baOutputStream));

        dout.writeInt(type);
        dout.writeLong(timestamp);

        System.out.println("getBytes using identifier: " + identifier);

        byte[] identifierBytes = identifier.getBytes();
        int elementLength = identifierBytes.length;
        dout.writeInt(elementLength);
        dout.write(identifierBytes);

        dout.writeInt(tracker);

        dout.flush();
        marshalledBytes = baOutputStream.toByteArray();

        baOutputStream.close();
        dout.close();

        return marshalledBytes;
    }
}

I'll save space by not posting the unmarshalling portion. But its the same thing just in reverse.

The issue I am having is printing the data from the Client-side as proof of what I am sending beforehand.

So I will perform a simple test like print the type or print the identifier. It fails and I have null.

Jason :

You're not initializing WireFormatWidget#identifier. It's declared but never initialized. Add a constructor to WireFormatWidget and provide a String as the identifier.

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=417352&siteId=1