将字符串转换为类对象

我使用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

建议阅读:

  1. 关于序列化的古老而优秀的Java技术文章
  2. http://java.sun.com/developer/technicalArticles/ALT/serialization/
  3. http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html

您无法使用toString()将类对象存储到字符串中,toString()仅以您想要的任何方式返回对象的String表示forms。 您可能想要阅读有关序列化的内容 。

您可以使用以下声明: –

 Class c = s.getClass(); 

获取类实例。