2012-01-02 69 views
1

我有一个用户定义的类,说转换用户自定义对象到字符串对象

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; 
    } 
} 

我创建员工的对象,并与setter方法填充它。我必须将上述对象表示为字符串(加密或人类可读)并解析回来以获得类似的对象。实际上,我想将相当于Java对象的字符串保存在一个文件中,并读回它们以获得一个java对象。我知道我们有写作的对象,但他们对编辑很敏感。我宁愿如果一个Java对象可以转换为人类可读形式的字符串。谢谢。

+1

你有什么需要的是系列化.. – 2012-01-02 10:55:00

+0

JSON是去给你,请检查下面的示例代码我的回答方式。 – anubhava 2012-01-02 11:12:43

+0

谢谢大家!我已经提出了所有的答案!感谢您的热烈响应。 – Ahamed 2012-01-02 13:30:12

回答

2

你可能会寻找toString方法:

返回该对象的字符串表示。通常,toString方法返回一个字符串,用于“文本地表示”此对象。结果应该是简明但内容丰富的表示 ,这对人们来说很容易阅读。建议所有 子类重写此方法。

在你的情况,你会做那种事(在每个类的添加):

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

的字符串可以是任何你希望的格式。为了保存对象,你需要做的就是写入toString方法返回到文件的文本。

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

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

+0

太棒了!非常感谢。它简单而有效。再次感谢 – Ahamed 2012-01-02 13:24:22

3

您应该重写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的一部分。

+0

toString()方法可以代表一个对象,但可以将它们读回来吗?此外,我有日历对象,并在其中另一个用户定义的对象。所以很难实施我们自己的方法。有没有可用的API来做到这一点?非常感谢。 – Ahamed 2012-01-02 10:59:13

+0

为了从字符串表单重新创建一个实例,我提出了一个静态工厂方法'fromString()'。我已经添加了如何使用这两种方法的演示。 – 2012-01-02 11:07:18

+0

至于日历实例,您可以根据'toString()'生成的字符串中存储的内容重新创建它们(您必须提供足够的信息以允许您的字符串表示形式)。另外,Calendar实现了Serializable,所以你可以考虑序列化。 – 2012-01-02 11:10:16

3

为了让您的拼合对象易于人工读取和手动编辑,请考虑使用其中一种流行的JSON库将对象编码为JSON字符串。相同的JSON库也将为您提供API以将JSON字符串解码到您的对象中。

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

1

试试这个

Employee em = new Employee; 

//Your code 

str obj= JavaScriptSerializer.Serialize(); 

// whenever you want to get object again 

Employee emp = (Employee)JavaScriptSerializer.Deserialize(); 
+0

我无法使用JavaScriptSerializer。是来自Jdk还是外部库? – Ahamed 2012-01-02 13:17:37