将字符串转换为类对象 [关闭]
Posted
技术标签:
【中文标题】将字符串转换为类对象 [关闭]【英文标题】:Convert String into a Class Object [closed] 【发布时间】:2011-07-21 01:31:30 【问题描述】:我使用toString()
方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。
如何做到这一点?请帮我提供源代码。
【问题讨论】:
【参考方案1】:你可能想用 json 来做。 将您的 bean(*) 转换为 json 然后返回。 这个过程称为序列化和反序列化 阅读它here
(*) 不要只使用成员作为数据源,为对象中的每个成员构建 getter 和 setter。
【讨论】:
【参考方案2】:更简单的方法: 您将需要 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);
将对象转换为流式传输并在另一侧读取的更简单的方法。 希望这可以帮助。 - Vishesh
【讨论】:
太棒了! @user2516769,很好的答案!它拯救了我的一天,解决了我的大问题。 @user2516769 这是一个非常聪明的简单方法。 :)【参考方案3】:我正在使用 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.***.ReadWriteObjecto$˲é¦LÚ ?I ?ageL ?firstNamet ?Ljava/lang/String;L ?lastNameq ~ ?xp ?t ?John ?Doe
ReadWriteObject [age=18, firstName=John, lastName=Doe]
【讨论】:
【参考方案4】:我正在使用 toString() 方法将类对象存储到字符串中。现在,我想将字符串转换为该类对象。
您的问题模棱两可。这可能意味着至少两件不同的事情,其中一件是……嗯……对你来说是一个严重的误解。
如果你这样做了:
SomeClass object = ...
String s = object.toString();
那么答案是没有简单的方法可以将s
转回SomeClass
的实例。即使toString()
方法为您提供了那些时髦的“SomeClass@xxxxxxxx”字符串之一,您也无法做到这一点。 (该字符串不编码对象的状态,甚至不编码对象的引用。xxxxxxxx 部分是对象的身份哈希码。它不是唯一的,不能神奇地变回引用到对象。)
将toString
的输出转换回对象的唯一方法是:
SomeClass.toString()
方法,以便在它生成的字符串中包含对象的所有相关状态,并且
编写一个构造函数或工厂方法,以toString()
方法生成的格式显式解析字符串。
这可能是一个不好的方法。当然,为非平凡的类做这件事需要做很多工作。
如果你做了这样的事情:
SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();
然后你可以得到相同的Class
对象(即c
中的那个),如下所示:
Class c2 = Class.forName(cn);
这为您提供了Class
,但没有神奇的方法可以使用它来重建原始实例。 (很明显,类名中不包含对象的状态。)
如果您正在寻找一种方法来序列化/反序列化任意对象 而无需自己编写 unparse / parse 方法,那么您不应该完全使用toString()
方法。以下是您可以使用的一些替代方案:
这些方法中的每一种都有优点和缺点......我不会在这里讨论。
【讨论】:
【参考方案5】:正如其他人所说,您的问题充其量是模棱两可的。问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。
但是,请注意,虽然 Java 中的许多对象类型都有字符串表示,但这并不能保证可以从其字符串表示中构造对象。
引用this source,
对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。
所以,你看,你想要的可能是不可能的。但是可以将对象的状态保存到字节序列中,然后从该字节序列中重构它。
【讨论】:
【参考方案6】:你可以使用语句:-
Class c = s.getClass();
获取类实例。
【讨论】:
【参考方案7】:Class.forName(nameString).newInstance();
【讨论】:
不反对,但似乎 OP 想要将对象(带有状态)保存作为字符串,然后转换回具有相同状态的对象。forName
加载类并为您提供 Class
对象而不是类的实例。 download.oracle.com/javase/6/docs/api/java/lang/…【参考方案8】:
您不能使用 toString() 将类对象存储到字符串中,toString() 只会以您想要的任何方式返回对象的字符串表示形式。您可能想阅读一下Serialization。
【讨论】:
【参考方案9】:继续我的评论。 toString
不是解决方案。一些优秀的灵魂已经为 Java 中的对象的序列化和反序列化编写了完整的代码。见这里:http://www.javabeginner.com/uncategorized/java-serialization
建议阅读:
-
又老又好Java Technical Article on Serialization
http://java.sun.com/developer/technicalArticles/ALT/serialization/
http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html
【讨论】:
以上是关于将字符串转换为类对象 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫编程思想(79): 将JSON字符串转换为类实例
Python爬虫编程思想(79): 将JSON字符串转换为类实例