0

I have an Object array of Object array. I want to convert it into a byte array and then receive it back as array of Object array. I have used theObjectOutputStream in conjunction with the ByteArrayOutputStream to convert it into a byte array:

ByteArrayOutputStream b = new BAOS();
ObjectOutputStream o = new OOS();
o.writeObject(obj)  // obj being the array

Then when I try to read it, all that I get is the content of the first array only. Also the size of the object array received is equal to the size of the individual arrays.

I have tried using iteration for writeObject() but to no avail.

Ok, so further I have tried the multi dimensional array approach as well:

byte[] firstArr = new byte[1];
oos.writeObject(orgArr[0]);
firstArr = baos.toByteArray();
byte[] secondArr = new byte[1];
oos.writeObject(orgArr[1]);
secondArr = baos.toByteArray();
byte[] combined = new byte[2];
combined[0] = firstArr[0];
combined[1] = secondArr[1];

Both arrays are the same, of same length and both the firstArr and secondArr are Object arrays. So, the problem that I have is that when I deserialize it using:

ObjectInputStream ois = new ObjectInputStream(
                    new ByteArrayInputStream(om.nakedPayload));
Object[] list = (Object[]) ois.readObject();

The length of the array list returned is 38. Which is the length of either of the 2 arrays (firstArr/secondArr). Also, the data that it contains is just of the firstArr. The om.nakedPayload is the data which I read from a Kafka topic. We have a wrapper written here so essentially, it expects a byte[] for read/write purposes.

2
  • It's hard to tell what your bug is, if you only show a couple of lines of your code. Commented Aug 8, 2015 at 2:56
  • Understand that using "serialization" is pretty complicated stuff (and a bit buggy besides). Not for the faint of heart. Commented Aug 8, 2015 at 3:08

1 Answer 1

1

Let's simplify the task and assume your object is Integer, then the code for serializing/deserializing will look like following:

import java.io.*;

public class ArrayOfArrays {

    public static void main(String[] args) throws Exception{
        String fileName = "myobject.data";
        FileOutputStream fileOut = new FileOutputStream(fileName);
        ObjectOutputStream out = new ObjectOutputStream(fileOut);

        Integer[][] intArray = new Integer[3][3];
        intArray[0] = new Integer[] {11, 12, 13};
        intArray[1] = new Integer[] {21, 22, 23};
        intArray[2] = new Integer[] {31, 32, 33};

        out.writeObject(intArray);

        FileInputStream fileIn = new FileInputStream(fileName);
        ObjectInputStream in = new ObjectInputStream(fileIn);

        Integer[][] intArrayIn =  (Integer[][]) in.readObject();
    }
}


This will give same "array of arrays" object back. Next step we can replace Integer with any class which implements marker interface java.io.Serializable.

All non-transient fields will be involved in serialization/deserialization and restored along with root "array of arrays" object.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.