我使用toString()
方法将类对象存储到字符串中。现在,我想将字符串转换为该类对象。
怎么做?请帮我提供源代码。
答案 0 :(得分:26)
我使用toString()方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。
你的问题很模糊。这可能意味着至少有两件不同的事情,其中之一就是......嗯......你这是一个严重的误解。
如果你这样做了:
SomeClass object = ...
String s = object.toString();
然后答案是没有简单的方法可以将s
转回SomeClass
的实例。即使toString()
方法给你一个时髦的“SomeClass @ xxxxxxxx”字符串,你也无法做到。 (该字符串不编码对象的状态,甚至不编码对象的引用.xxxxxxxx部分是对象的身份哈希码。它不是唯一的,不能神奇地转回参考对象。)
将toString
的输出转换回对象的唯一方法是:
SomeClass.toString()
方法进行编码,以便在其生成的String中包含对象的所有相关状态,并toString()
方法生成的格式显式解析字符串的构造函数或工厂方法。这可能是一个糟糕的方法。当然,要为非平凡的课程做这件事需要做很多工作。
如果你做了这样的事情:
SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();
然后您可以返回相同的Class
对象(即c
中的对象),如下所示:
Class c2 = Class.forName(cn);
这为您提供Class
,但没有神奇的方法可以使用它重建原始实例。 (显然,类的名称不包含对象的状态。)
如果您正在寻找一种方法来序列化/反序列化任意对象,而不需要自己编写解码/解析方法,那么不应该完全使用toString()
方法。以下是您可以使用的一些替代方案:
这些方法中的每一种都有优点和缺点......我不会在这里讨论。
答案 1 :(得分:17)
更简单的方法: 您将需要com.google.gson.Gson将对象转换为流式传输的json字符串
将对象转换为json字符串,以便在代码
下使用流式传输Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);
要在代码下面将json字符串转换回对象:
Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);
在另一方面转换对象以进行流式传输和读取的更简单方法。 希望这可以帮助。 - 维斯什
答案 2 :(得分:6)
Class.forName(nameString).newInstance();
答案 3 :(得分:2)
我使用toString()方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。
首先,如果我理解你的问题,你想将你的对象存储到一个字符串中,然后再次读取它并重新创建对象。
就个人而言,当我需要这样做时,我使用ObjectOutputStream。但是,有一个强制性条件。要转换为String然后再转换为Object的对象必须是Serializable对象及其所有属性。
让我们考虑ReadWriteObject
,操纵对象和ReadWriteTest
操纵者。
我将如何做到这一点:
public class ReadWriteObject implements Serializable {
/** Serial Version UID */
private static final long serialVersionUID = 8008750006656191706L;
private int age;
private String firstName;
private String lastName;
/**
* @param age
* @param firstName
* @param lastName
*/
public ReadWriteObject(int age, String firstName, String lastName) {
super();
this.age = age;
this.firstName = firstName;
this.lastName = lastName;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "ReadWriteObject [age=" + age + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
public class ReadWriteTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// Create Object to write and then to read
// This object must be Serializable, and all its subobjects as well
ReadWriteObject inputObject = new ReadWriteObject(18, "John", "Doe");
// Read Write Object test
// Write Object into a Byte Array
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(inputObject);
byte[] rawData = baos.toByteArray();
String rawString = new String(rawData);
System.out.println(rawString);
// Read Object from the Byte Array
byte[] byteArrayFromString = rawString.getBytes();
ByteArrayInputStream bais = new ByteArrayInputStream(byteArrayFromString);
ObjectInputStream ois = new ObjectInputStream(bais);
Object outputObject = ois.readObject();
System.out.println(outputObject);
}
}
标准输出与此类似(实际上,我无法复制/粘贴它):
¬í ?sr ?*com.ajoumady.stackoverflow.ReadWriteObjecto$˲é¦LÚ ?I ?ageL ?firstNamet ?Ljava/lang/String;L ?lastNameq ~ ?xp ?t ?John ?Doe
ReadWriteObject [age=18, firstName=John, lastName=Doe]
答案 4 :(得分:1)
你可能想用json做这件事 然后将你的bean(*)转换为json 这个过程被称为序列化和反序列化 阅读它here
(*)不要只使用成员作为数据源,为对象中的每个成员构建getter和setter。
答案 5 :(得分:1)
正如其他人所说,你的问题充其量是模棱两可的。问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。
但是,请注意,虽然Java中的许多对象类型都有字符串表示形式,但这并不能保证可以从字符串表示形式构造对象。
引用this source,
对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。
所以,你知道,你想要的可能是不可能的。但是可以将对象的状态保存为字节序列,然后从该字节序列重构它。
答案 6 :(得分:0)
继续发表评论。 toString
不是解决方案。一些好的灵魂已经为Java中的对象的序列化和反序列化编写了完整的代码。见这里:http://www.javabeginner.com/uncategorized/java-serialization
建议阅读:
答案 7 :(得分:0)
您无法使用toString()将类对象存储到字符串中,toString()仅以您想要的任何方式返回对象的String表示形式。您可能想要阅读Serialization。
答案 8 :(得分:0)
您可以使用以下声明: -
Class c = s.getClass();
获取类实例。