【问题标题】:Deserialization from String in JavaJava中字符串的反序列化
【发布时间】:2016-02-01 18:06:44
【问题描述】:

这是我在这里的第一篇文章,但我真的需要帮助,因为我刚刚开始学习 Java 中的序列化/反序列化:

我有一个看起来像这样的字符串:

String str = "ExampleClass[id=123,date=2009-07-12,state=OPEN]";

我的问题是:我可以反序列化它以便访问这个字符串中的信息吗? 我只见过他们使用ObjectOutputStream.writeObject() 方法首先创建文件然后从中读取的示例。

我还有一个类似这样的类:

public class ExampleClass implements Serializable { 
    protected String id;
    protected Date startDate;
    protected String state;

    //other code...

    public String toString(){
        return "ExampleClass[id="+id+",date="+startDate+",status="state"]";
    }
}

也许我还没有完全理解反序列化的概念,但希望我能在这里得到一个意见,看看我正在尝试做的事情是否行不通或没有意义。 提前致谢!

【问题讨论】:

  • 以下内容可能对stackoverflow.com/questions/12963445/…有帮助
  • 您“似乎”想要做的是将String 值解析回Object 表示,这实际上不是序列化所做的,它需要一个对象并生成一个二进制表示,可以存储到文件中或通过网络传输到另一台计算机。对于您的问题,您需要编写一些代码来从 String 中提取值,然后生成该类的新实例
  • 实现 toString 也不是序列化

标签: java string serialization deserialization


【解决方案1】:

不清楚你在问什么。您所描述的构成解析一个字符串,而不是反序列化它,这是微不足道的。

您的第二个示例的问题似乎始于toString() 方法。为什么要拥有它?只需序列化实际对象,而不是其toString() 方法的结果,然后直接反序列化它。字符串根本不进入它。

【讨论】:

    【解决方案2】:

    使用字符串非常简单。

    对象可以被序列化,因为它实现了 Serializable 接口。

    字符串属性也将被序列化,因为它们也是可序列化的。

    您可以通过调用其writeObject 方法来序列化任何可序列化对象。

    您可以通过调用其readObject 方法来反序列化任何对象。

    您可以通过任何通信渠道发送可序列化对象。通常,该过程涉及使用其writeObject 方法将其写入某种OutputStream 扩展实例,然后使用其readObject 方法从某种InputStream 扩展实例读取它。

    非常简单,非常直接,特别是在不涉及瞬态属性并且您甚至不需要实现自己的特定序列化/反序列化方法的情况下。

    如果您还有任何疑问,serializable objects 上的 Oracle 官方文档可以为您提供很多帮助。对于实际示例,请查看其他答案,例如 How to send and receive serialized object in socket channel

    多年来,该主题已被广泛讨论,您可以在网上找到非常好的资源。如果您对您的特定使用情况有任何具体问题,请随时提出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多