2012-01-02 63 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