【问题标题】:Convert Userdefined Object to a String Object将用户定义的对象转换为字符串对象
【发布时间】:2012-01-02 10:52:43
【问题描述】:

我有一个用户定义的类,比如说

import java.util.Calendar;

public class Employee{
    private String name;
    private int age;
    private Calendar dob;
    private Address address;
    private boolean married;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Calendar getDob() {
        return dob;
    }
    public void setDob(Calendar dob) {
        this.dob = dob;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public boolean isMarried() {
        return married;
    }
    public void setMarried(boolean married) {
        this.married = married;
    }
}
class Address{
    private int doorNo;
    private String streetName;
    private String city;
    public int getDoorNo() {
        return doorNo;
    }
    public void setDoorNo(int doorNo) {
        this.doorNo = doorNo;
    }
    public String getStreetName() {
        return streetName;
    }
    public void setStreetName(String streetName) {
        this.streetName = streetName;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
}

我正在创建一个 Employee 对象并用 setter 填充它。我必须将上述对象表示为字符串(加密或人类可读)并解析回来以获取类似的对象。实际上,我想将等效于 java 对象的字符串保存在文件中并读回它们以获取 java 对象。我知道我们有对象写作,但他们对编辑很敏感。如果可以将 java 对象转换为人类可读形式的字符串,我会更喜欢。谢谢。

【问题讨论】:

  • 你需要的是序列化..
  • JSON 是适合您的方式,请查看下面的示例代码。
  • 谢谢大家!我已经对所有答案投了赞成票!感谢您的热烈响应。

标签: java string object


【解决方案1】:

为了使您的展平对象具有可读性和可手动编辑性,请考虑使用流行的 JSON 库之一将您的对象编码为 JSON 字符串。相同的 JSON 库还将为您提供 API 以将 JSON 字符串解码为您的对象。

一个流行的 JSON 库是Gson。这是一个使用示例:Converting JSON to Java

【讨论】:

    【解决方案2】:

    您应该覆盖toString() 以将您的类的实例转换为字符串。至于根据它们的字符串表示重新创建实例,您可以为此定义一个静态工厂方法。

    public class Employee {
      ...
      @Override
      public String toString() {
        ...
      }
    
      public static Employee fromString(String str) {
        ...
      }
    }
    

    你可以像这样使用这些方法:

    获取实例的字符串表示为字符串:

    Employee john = ...
    String johnString = john.toString();
    

    请注意,只要需要获取其中一个实例的字符串表示形式,您的 toString() 方法也会被隐式调用。

    从字符串重新创建实例:

    Employee john = Employee.fromString(johnString);
    

    如果您经常需要将类的实例存储在文件中并读取它们,您也可以考虑序列化。请参阅Serializable 接口以及ObjectInputStreamObjectOutputStream 的文档。您可能还想通过阅读Effective Java, second edition 中的最后一章(“序列化”)来熟悉有关序列化的注意事项。最重要的是请注意,您的类的序列化形式将成为您公共 API 的一部分。

    【讨论】:

    • toString() 方法可以用于表示一个对象,但用于读取它们呢?此外,我有日历对象,其中还有另一个用户定义的对象。所以很难实现我们自己的方法。有没有可用的 API 来做到这一点?非常感谢。
    • 为了从字符串形式重新创建一个实例,我建议使用静态工厂方法fromString()。我添加了如何使用这两种方法的演示。
    • 对于日历实例,您可以根据toString() 生成的字符串中存储的内容重新创建它们(您必须提供足够的信息以允许您的字符串表示形式)。此外,Calendar 实现了 Serializable,因此您可以考虑序列化。
    【解决方案3】:

    您可能正在寻找toString 方法:

    返回对象的字符串表示形式。一般来说, toString 方法返回一个“以文本形式表示”的字符串 目的。结果应该是简洁但信息丰富的表示 这对一个人来说很容易阅读。建议所有 子类覆盖此方法。

    在你的情况下,你会做一些事情(要添加到你的每个类中):

    @Override
    public String toString()
    {
      return "Name = " + name + ...
    }
    

    字符串可以是您希望的任何格式。要保存对象,您只需将 toString 方法返回的文本写入文件即可。

    但是,要读回它们,您必须实现自己的逻辑。另一方面,您可以做的是使用诸如XStream(指令here)之类的东西,它会自动将您的对象转换为XML。

    XML 是人类可读的,因此您的用户可以修改他们需要的任何内容。完成此操作后,您可以重新使用 XStream 读回您的对象。

    【讨论】:

    • 太棒了!非常感谢。它简单有效。再次感谢
    【解决方案4】:

    试试这个

    Employee em = new Employee;
    
    //Your code
    
    str obj= JavaScriptSerializer.Serialize();
    
    // whenever you want to get object again
    
    Employee emp = (Employee)JavaScriptSerializer.Deserialize();
    

    【讨论】:

    • 我无法使用该 JavaScriptSerializer。是来自 Jdk 还是外部库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多