将字符串转换为类对象
我使用toString()
方法将类对象存储到字符串中。 现在,我想将字符串转换为该类对象。
怎么做? 请帮我提供源代码。
我使用toString()方法将类对象存储到字符串中。 现在,我想将字符串转换为该类对象。
你的问题很模糊。 它可能意味着至少两件不同的事情,其中之一就是……嗯……你的严重误解。
如果你这样做:
SomeClass object = ... String s = object.toString();
那么答案就是没有简单的方法可以将s
转回SomeClass
的实例。 即使toString()
方法给你一个时髦的“SomeClass @ xxxxxxxx”字符串,你也无法做到。 (该字符串不编码对象的状态,甚至不编码对象的引用.xxxxxxxx部分是对象的标识哈希码 。它不是唯一的,不能神奇地转回到对象的引用。)
将toString
的输出转换回对象的唯一方法是:
- 编码
SomeClass.toString()
方法,以便包含它生成的String中对象的所有相关状态,以及 - 编码以
toString()
方法生成的格式显式解析String的构造函数或工厂方法。
这可能是一个糟糕的方法。 当然,为非平凡的课程做这件事需要做很多工作。
如果你做了这样的事情:
SomeClass object = ... Class c = object.getClass(); String cn = c.toString();
那么你可以得到相同的Class
对象(即c
那个),如下所示:
Class c2 = Class.forName(cn);
这为您提供了Class
但没有神奇的方法来使用它重建原始实例。 (显然,类的名称不包含对象的状态。)
如果您正在寻找一种序列化/反序列化任意对象的方法而不需要自己编写unparse / parse方法,那么您根本不应该使用toString()
方法。 以下是您可以使用的一些替代方案:
- Java对象序列化API,如@Nishant的答案中的链接所述。
- @ fatnjazzy的答案中描述的JSON序列化。
- 像XStream这样的XML序列化库。
- ORM映射。
这些方法中的每一种都有优点和缺点……我不会在这里讨论。
更简单的方法:您需要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);
在另一方面转换对象以进行流式传输和读取的更容易的方法。 希望这可以帮助。 – 维施什
Class.forName(nameString).newInstance();
我使用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]
正如其他人所说,你的问题充其量是模棱两可的。 问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。
但请注意,尽管Java中的许多对象类型都具有字符串表示forms,但这并不能保证可以从其字符串表示forms构造对象。
引用此来源 ,
对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。
所以,你看,你想要的可能是不可能的。 但是可以将对象的状态保存为字节序列,然后从该字节序列重构它。
你可能想用json做。
然后将你的bean(*)转换为json。
这个过程被称为序列化和反序列化
在这里阅读它
(*)不要只使用成员作为数据源,为对象中的每个成员构建getter和setter。
继续我的评论。 toString
不是解决方案。 一些好的灵魂已经为Java中的对象的序列化和反序列化编写了完整的代码。 见这里: http : //www.javabeginner.com/uncategorized/java-serialization
建议阅读:
您无法使用toString()将类对象存储到字符串中,toString()仅以您想要的任何方式返回对象的String表示forms。 您可能想要阅读有关序列化的内容 。
您可以使用以下声明: –
Class c = s.getClass();
获取类实例。