Simon
Simon

Reputation: 2246

java, writing data size with DataOutputStream

I have a series of objects which write their data out to a file via DataOutputStream.

As my application file format evolves, I will be adding further data objects to it, which should be able to be read by "older" versions of the application.

To be able to do this, I am needing to preface the objects data with a size value indicating the number of bytes that the current object will take up.

However, as this data can be a variable size, notably when handling strings, I cannot know beforehand what the size will be.

Is there a way to "pre-write" to a byte buffer, as if it were a DataOutputStream (methods in particular - writeByte, writeShort, writeInt, writeUTF) which will enable me to get back the byte length of the data before writing it out to the DataOutputStream ? Doing this will enable me to skip over newer data objects that older versions of the application does understand.

Upvotes: 1

Views: 724

Answers (2)

Malt
Malt

Reputation: 30285

Regular Java serialization is not that great for a variety of reasons. One of the most important ones is that it's very brittle, and tends not to be "future proof". If possible, I'd suggest you use a different serialization format, especially if you specifically mention that you plan on adding fields to the class you serialize.

Formats such as Protobuf, and JSON have Java libraries with nice APIs, and good forwards/backwards compatibility features. In most cases, it would be far simpler to Serialize your data into a more convenient format, than solving the problems of the existing one.

Upvotes: 1

Jayyrus
Jayyrus

Reputation: 13051

As you can see here, you could use java.lang.instrument.Instrumentation in this way:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

and then calculate the size in bytes of your object:

public static void main(String [] args) {
   Object myObject = ...;
        System.out.println(ObjectSizeFetcher.getObjectSize(myObject));
    }

Upvotes: 0

Related Questions