【问题标题】:Convert String into a Class Object [closed]将字符串转换为类对象 [关闭]
【发布时间】:2011-07-21 01:31:30
【问题描述】:

我使用toString() 方法将一个类对象存储到一个字符串中。现在,我想将字符串转换为该类对象。

如何做到这一点?请帮我提供源代码。

【问题讨论】:

    标签: java string object


    【解决方案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.stackoverflow.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() 方法。以下是您可以使用的一些替代方案:

        • @Nishant 答案中的链接中描述的 Java 对象序列化 API。
        • @fatnjazzy 的回答中描述的 JSON 序列化。
        • 像 XStream 这样的 XML 序列化库。
        • ORM 映射。

        这些方法中的每一种都有优点和缺点......我不会在这里讨论。

        【讨论】:

          【解决方案5】:

          正如其他人所说,您的问题充其量是模棱两可的。问题是,您希望将对象表示为字符串,然后能够从该字符串再次构造对象。

          但是,请注意,虽然 Java 中的许多对象类型都有字符串表示,但这并不能保证可以从其字符串表示中构造对象。

          引用this source

          对象序列化是将对象的状态保存到字节序列的过程,以及在将来某个时间将这些字节重建为活动对象的过程。

          所以,你看,你想要的可能是不可能的。但是可以将对象的状态保存到字节序列中,然后从该字节序列中重构它。

          【讨论】:

            【解决方案6】:

            你可以使用语句:-

            Class c = s.getClass();
            

            获取类实例。

            【讨论】:

              【解决方案7】:
              Class.forName(nameString).newInstance();
              

              【讨论】:

              【解决方案8】:

              您不能使用 toString() 将类对象存储到字符串中,toString() 只会以您想要的任何方式返回对象的字符串表示形式。您可能想阅读一下Serialization

              【讨论】:

                【解决方案9】:

                继续我的评论。 toString 不是解决方案。一些优秀的灵魂已经为 Java 中的对象的序列化和反序列化编写了完整的代码。见这里:http://www.javabeginner.com/uncategorized/java-serialization

                建议阅读:

                1. 又老又好Java Technical Article on Serialization
                2. http://java.sun.com/developer/technicalArticles/ALT/serialization/
                3. http://java.sun.com/developer/onlineTraining/Programming/BasicJava2/serial.html

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-09
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-02-07
                  • 2018-01-06
                  • 2020-03-30
                  • 2013-02-16
                  相关资源
                  最近更新 更多