Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing my own serialization in java

How can I implement serialization on my own. Meaning I don't want my class to implement serializable. But I want to implement serialization myself. So that without implementing serializable I can transfer objects over network or write them to a file and later retrieve them in same state. I want to do it since I want to learn and explore things.

like image 240
akshay Avatar asked Nov 19 '25 00:11

akshay


2 Answers

Serialization is the process of translating the structure of an object into another format that could be easily transfered across network or could be stored in a file. Java serializes objects into a binary format. This is not necessary if bandwidth/disk-space is not a problem. You can simply encode your objects as XML:

// Code is for illustration purpose only, I haven't compiled it!!!

public class Person {
    private String name;
    private int age;
    // ...

   public String serializeToXml() {
       StringBuilder xml = new StringBuilder();   
       xml.append("<person>");
       xml.append("<attribute name=\"age\" type=\"int\">").append(age);
       xml.append("</attribute>");
       xml.append("<attribute name=\"name\" type=\"string\">").append(name);
       xml.append("</attribute>"); 
       xml.append("</person>");
       return xml.toString(); 
}

Now you can get an object's XML representation and "serialize" it to a file or a network connection. A program written in any language that can parse XML can "deserialize" this object into its own data structure.

If you need a more compact representation, you can think of binary encoding:

  // A naive binary serializer. 
  public byte[] serializeToBytes() {
      ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 

      // Object name and number of attributes.
      // Write the 4 byte length of the string and the string itself to
      // the ByteArrayOutputStream.
      writeString("Person", bytes);
      bytes.write(2); // number of attributes;

      // Serialize age
      writeString("age", bytes);
      bytes.write(1); // type = 1 (i.e, int)
      writeString(Integer.toString(age), bytes);  

      // serialize name
      writeString("name", bytes);
      bytes.write(2); // type = 2 (i.e, string) 
      writeString(name, bytes);

      return bytes.toByteArray();
  }

  private static void writeString(String s, ByteArrayOutputStream bytes) {
      bytes.write(s.length());
      bytes.write(s.toBytes());
  }

To learn about a more compact binary serialization scheme, see the Java implementation of Google Protocol Buffers.

like image 128
Vijay Mathew Avatar answered Nov 20 '25 15:11

Vijay Mathew


You can use Externalizable and implement your own serialization mechanism. One of the difficult aspects of serialization is versioning so this can be a challenging exercise to implement. You can also look at protobuf and Avro as binary serialization formats.

like image 30
Aravind Yarram Avatar answered Nov 20 '25 16:11

Aravind Yarram



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!