使用ObjectOutputStream的Java序列化对象工作一次,双方都尝试重置()

时间:2016-09-28 12:03:49

标签: java serialization objectoutputstream

我使用这个静态类作为在以各种方式发送/使用它们之前将对象序列化为字符串的方法。但是,序列化的对象似乎只能正确序列化一次。一个从20开始并且每次更新递增的变量只有21,即使我在序列化之前打印它,值也是正确的(大约1500左右)。

在回答之前,请注意我使用的是reset()和writeUnshared()。我尝试了几乎所有我能在网上找到的东西,似乎没什么用。

public class InformationInterface {

static ObjectInputStream ois;
static ObjectOutputStream oos;
static ByteArrayOutputStream baos;

public static Object fromString( String s ) throws IOException ,
        ClassNotFoundException {
    byte [] data = Base64.getDecoder().decode( s );
    ois = new ObjectInputStream(
            new ByteArrayInputStream(  data ) );
    Object o  = ois.readUnshared();
    ois.close();
    return o;
}

public static  String toString( Serializable o ) throws IOException {
    if(baos!=null){
        baos.flush();
    }
    baos = new ByteArrayOutputStream();
    baos.reset();
    oos = new ObjectOutputStream( baos );
    oos.reset();
    oos.writeUnshared(o);
    oos.flush();
    oos.close();
    return Base64.getEncoder().encodeToString(baos.toByteArray());
}

}

我在这里阅读了很多帖子,说明ObjectInputStream保留了已发送对象的引用(即使我每次创建一个新对象,只在序列化之间保持引用),使用writeUnshared()或reset()可以发送多个对象但是我似乎无法让它在我身上发挥作用。

我不明白为什么这不起作用。我甚至没有同时发送多个对象,只是想在我的服务器的整个生命周期中想要一种方法来序列化同一个对象。但是,收到第一次更新后,收到的序列化based64字符串根本不会更改。

请注意,我尝试了其他多种方法,包括坚持使用直接try / catch块创建一个全新的objectoutputstream,并在我通常称之为静态函数的地方调用reset。我也尝试使用ObjectOutput和ObjectInput并获得相同的结果。

每个人似乎都使用reset()解决了他们的问题,这不是我的情况。我可以在我的代码中的其他地方做错了吗?由于我在序列化之前读取了数据,并且可以在序列化之前确认它实际上应该是一个新对象,我怀疑这个问题是非常远的。

编辑,只是尝试使用apacheutils的不同方式,我得到完全相同的结果。这是带有输出的新代码:

public static Object fromString( String s ) throws IOException ,
        ClassNotFoundException {
    return convertFromBytes(Base64.getDecoder().decode(s));
}
private static byte[] convertToBytes(Serializable object) throws IOException {
    ClientInformation client = (ClientInformation)object;
    System.out.println(client.hp);
    return SerializationUtils.serialize(object);
}
private static Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException {
    return SerializationUtils.deserialize(bytes);
}
public static  String toString( Serializable o ) throws IOException {
    String s = Base64.getEncoder().encodeToString(convertToBytes(o));
    System.out.println(s);
    return s;
}


794
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADGgGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA=
795
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADGwGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA=
796
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADHAGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA=
797
rO0ABXNyACBjb20ucjMuZW5kZ2FtZS5DbGllbnRJbmZvcm1hdGlvbj8t7NEouSNIAgAISQACaHBTAAdzbmFrZWlkSQAIc3Bkc2NhbGVMAANhYmN0ABJMamF2YS9sYW5nL1N0cmluZztMAAJpcHEAfgABTAAEbmFtZXEAfgABTAAIcG9zaXRpb250AB9MY29tL2JhZGxvZ2ljL2dkeC9tYXRoL1ZlY3RvcjI7TAAFc3BlZWRxAH4AAnhwAAADHQGkAAAAAXB0ABAvMTI3LjAuMC4xOjQ1Mzk0dAAHYXMzMmRkZHNyAB1jb20uYmFkbG9naWMuZ2R4Lm1hdGguVmVjdG9yMgyu1b5sQZuzAgACRgABeEYAAXl4cAAAAAAAAAAAc3EAfgAGPczMzQAAAAA=

如您所见,序列化字符串是相同的。

1 个答案:

答案 0 :(得分:1)

这是你不应该做的事情。

从我做的代码的上下文:

public static void main(String[] args) throws IOException {
    ClientInformation ci = new ClientInformation();
    //      System.out.println(toString(ci));
    toString(ci);
    ci.hp = 3;
    toString(ci);
    //      System.out.println(toString(ci));
}

@SuppressWarnings("serial")
private static class ClientInformation implements Serializable {
    public int hp = 2;
}

我使用你的代码从IDE运行它,结果就是这样:

2
rO0ABXNyADduZXRjcmF3bGVyLmZhY3Rvcmllcy5BcHBsaWNhbnRGYWN0b3J5JENsaWVudEluZm9ybWF0aW9uu7p3ca7TTqkCAAFJAAJocHhwAAAAAg==
3
rO0ABXNyADduZXRjcmF3bGVyLmZhY3Rvcmllcy5BcHBsaWNhbnRGYWN0b3J5JENsaWVudEluZm9ybWF0aW9uu7p3ca7TTqkCAAFJAAJocHhwAAAAAw==

字符串不匹配。问题不在这里。