序列化数据在PC上损坏,但在Android设备上没有

时间:2014-04-28 01:59:29

标签: java android serialization

我正在开发一个可在PC和Android上运行的跨平台应用。此应用程序序列化对象并将其保存到我们服务器上的文件中。我遇到的问题是当我反序列化PC上的一个对象时,我收到以下错误:

java.io.StreamCorruptedException: invalid type code: 71
at java.io.ObjectInputStream.readString(ObjectInputStream.java:1646)
at java.io.ObjectInputStream.readEnum(ObjectInputStream.java:1736)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
at java.io.ObjectInputStream.readArray(ObjectInputStream.java:1706)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1344)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)

但是,我可以成功反序列化Android手机(三星s5)上的对象。这完全让我感到困惑。我已将其缩小到平台问题,因为我已经直接采用编码字符串并在两台设备上解码,其中PC上弹出错误而Android设备上没有。这告诉我,编码的字符串实际上并没有损坏。我错过了什么吗?任何建议,将不胜感激。

以下是我用来序列化对象的代码:

public static String objectToString(Serializable object) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    try {
        ObjectOutputStream obj = new ObjectOutputStream(out);
        obj.writeObject(object);
        byte[] data = out.toByteArray();
        obj.close();
        out.close();

        return new String(Base64Coder.encode(data));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public static Object stringToObject(String encodedObject) {
    try {
        ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(encodedObject));
        ObjectInputStream input = new ObjectInputStream(bin);
        try{
        return input.readObject();
        }finally{
            Gdx.app.log(TAG, "Input closed!");
            input.close();
            bin.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

此外,this我使用的Base64编码器。

2 个答案:

答案 0 :(得分:0)

您忘记将String转换为byte []以反转执行new String(Base64Coder.encode(data))时发生的隐式byte []到String转换。

请改为尝试:

public static Object stringToObject(String encodedObject) {
    try {
        byte[] byteArray = encodedObject.getBytes();
        ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(byteArray));

而不是:

public static Object stringToObject(String encodedObject) {
    try {
        ByteArrayInputStream bin = new ByteArrayInputStream(Base64Coder.decode(encodedObject));

答案 1 :(得分:0)

问题是Android高达7.0版(API 24)使用Apache Harmony Java实现,该对象序列化格式与“常规”JRE不兼容。

由于Android 7.0使用OpenJDK并且兼容。

另见: