【问题标题】:Java: Is a Serialized stream tokenizable?Java:序列化流是否可标记?
【发布时间】:2017-06-23 02:52:11
【问题描述】:

我有两个类,它们都实现了 Serializable 接口。我想通过套接字发送这两个类的对象。

我了解为类实现 Serialize 会使其对象转换为字节流以存储在文件中或通过 Internet 传输。

我的问题是:有什么方法可以标记对象,以便我可以轻松地在服务器端读取传入的 ObjectStream 吗?

标记为:

客户端:

ObjectOutputStream.writeObject(obj1 + "," + obj2);

其中 obj1 和 obj2 是可序列化类的对象。

服务器端:

SomeTokenizer st = new SomeTokenizer(ObjectInputStream.readObject(), ",");
Class1 obj1 = st.nextToken();
Class2 obj2 = st.nextToken();

谢谢!

【问题讨论】:

  • 为什么? ObjectInputStream.readObject() 突然有问题?只需逐个写出这两个对象,然后以相同的方式读取它们。
  • 好的!但是,我是新来的,我不明白为什么我的问题被否决了? @EJP
  • @yshavit 不,它们不可标记,并且说它们不是“换一种方式”。 OP 的代码将编写一个由obj1.toString()+","+obj2.toString() 组成的String,而这是否是可标记的或在任何方面确实有用仍然完全没有实际意义。
  • @EJP 你说得对,当可能引起混淆时,我应该更加小心地以类比的方式抛出术语。

标签: java sockets serialization


【解决方案1】:

对象流不可标记。数据以二进制编码。


您的代码实际上在做的(或多或少)是将对象转换为逗号分隔的字符串,然后将该字符串作为对象流序列化发送。当你这样做时:

ObjectOutputStream.writeObject(obj1 + "," + obj2);

您依靠obj1obj2 各自的toString() 方法将它们转换为可解码 字符串。如果这有效,那么以下可能“有效”:

StringTokenizer st = new StringTokenizer(
    (String) ObjectInputStream.readObject(), ",");
String obj1AsString = st.nextToken();
String obj2AsString = st.nextToken();

先决条件是

  1. 您需要编写自定义的toString() 方法,
  2. toString() 方法需要包含所有必要的信息,
  3. toString() 方法不得包含逗号以混淆标记化。

但是,您仍然需要将字符串转换回对象。这将需要 更多 自定义代码,这些代码可以解析您的 toString 方法生成的格式并重建对象。


这在很多层面上都是非常错误的。

有关执行此操作的正确方法,请参阅@EJP 的回答。

【讨论】:

  • 非常感谢您以清晰的方式解释! @StephenC​​pan>
【解决方案2】:

为什么?无需标记化。

out.writeObject(obj1);
out.writeObject(obj2);
// ...
Class1 obj1 = in.readObject();
Class2 obj2 = in.readObject();

【讨论】:

    猜你喜欢
    • 2017-08-15
    • 1970-01-01
    • 2017-02-21
    • 2015-11-10
    • 2016-01-18
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多