2010-04-15 106 views
1

我有一个程序,我需要通过将它转换为字符串来将Class对象存储到内存中。是否有可能将字符串转换回原始类,以便我可以使用该类变量?我正在用JAVA做这个。在Java中将字符串转换为字符串,反之亦然

例子:test.java

class hello{ 
public String h1; 
public String h2; 
} 
public class test { 

public static void main(String[] args) 
{ 
    hello h = new hello(); 

    h.h1 = "hello"; 
    h.h2 = "world"; 

    String s = h.toString(); 
    System.out.println("Print s : "+s); 

    // Now I need to convert String s into type hello so that 
      // I can do this: 
      // (hello)s.h1; 
      // (hello)s.h2; 
} 
} 

注:这是不是一个功课,这是一个个人项目,我会如果有人能帮助感激不尽!

谢谢! Ivar

+0

什么试图用h.toString()? – 2010-04-15 04:07:45

+0

您不是将对象“投射”为String,而是调用返回对象的String描述(通常用于调试/日志记录)的方法(toString())。这不是一个可逆的操作 - 按Derek的建议看待序列化。 – 2010-04-15 04:10:07

+0

请澄清:“需要将...存储到内存中”?你的意思是需要坚持它/将它保存在磁盘文件或数据库的某个地方吗? – 2010-04-15 05:31:18

回答

2

我认为你想要做的是序列化。我很困惑你的评论:

// Now I need to convert String s into type hello so that 
      // I can do this: 
      // (hello)s.h1; 
      // (hello)s.h2; 

你不能只是将String对象转换为任意类类型。也许你可以详细说明你想在这里完成什么。如果您希望能够将某个类“保存”到某个文件中,然后将其作为对象重新读入,则需要序列化。像这样:

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

class Hello implements Serializable { 
    public String h1; 
    public String h2; 

    @Override 
    public String toString() { 
    return "{ h1: " + h1 + ", h2: " + h2 + " }"; 
    } 

    public static void main(String[] args) throws Exception { 
    Hello h = new Hello(); 

    h.h1 = "hello"; 
    h.h2 = "world"; 

    ObjectOutputStream outstream = new ObjectOutputStream(new FileOutputStream("hello.ser")); 
    outstream.writeObject(h); 

    System.out.println("1) h: " + h); 

    h = null; 

    System.out.println("2) h: " + h); 

    ObjectInputStream instream = new ObjectInputStream(new FileInputStream("hello.ser")); 
    h = (Hello) instream.readObject(); 

    System.out.println("3) h: " + h); 

    } 
} 

当您的字段比String更复杂时,它会变得更加复杂。实现Serializable只是一个“标记”接口,它说对象可以被序列化,它不需要任何方法来实现。只需使用ObjectOutputStream写出简单的类,然后使用ObjectInputStream读回。

+0

这是完美的答案!非常感谢!! – 2010-04-16 09:29:25

1

我认为你需要做的是看看序列化/反序列化。

+0

工作!谢谢!! – 2010-04-16 09:28:09

0

如果您制作了对象hello的副本,那么您不必担心变回原始对象。

Hello h = new Hello(); 

Hello copyH = h; 
+0

谢谢大家的回复!真的帮了很多!我现在是序列化的好朋友:) - ivar – 2010-04-16 09:26:31

0

我有一个程序,我需要 店Class对象到内存中

创建一个对象,它已经位于内存中,如果你希望缓存它,你可能会后放入HashMap中以供以后访问。

将其转换为字符串。

没有从字符串转换为对象,反之亦然。

是否有可能将字符串转换 放回原类,这样我 可以使用类变量?

Java序列是二进制的。要将对象状态转换为字符串,您有几个选项。

  • 打印成员的String和使用的StringTokenizer分割字符串并分配(这可能需要对非字符串的数据类型转换)

  • 使用类似libcsv

  • 使用XML作为对象状态的字符串表示。在Java中,你可以使用我更喜欢的JAXB

0

您可以使用JavaBeans机制并实施PropertyEditor。你仍然需要自己实现字符串到对象的解析,如果你的对象很复杂,你需要在PropertyEditor中有很多逻辑来解析整个字符串。但是,当您准备好简单类型的编辑器时,可以在更多comlex编辑器中使用这些编辑器。

当然,如果你不绝对需要你的对象的字符串表示,你应该考虑的序列化等建议。

+0

谢谢大家的回复!真的帮了很多! 我现在是序列化的好朋友:) - ivar – 2010-04-16 09:26:15

0

如果你真的需要做这样的事情,你可以覆盖类的toString()方法,并创建一个静态方法(或创建一个转换器类),从它返回一个Hello对象的toString()。事情是这样的:

class Hello() { 
    public String h1; 
    public String h2; 

    public String toString() { 
     return "h1:" + h1 +", h2:" + h2; 
    } 

    public static Hello fromString(String input) { 
     Hello hello = new Hello(); 
     hello.h1 = // Some logic to extract h1 from input 
     hello.h2 = // Some logic to extract h2 from input 

     return hello; 
    } 
} 

这样,你应该能够:

Hello hello = new Hello(); 
String helloString = hello.toString(); 
Hello newHello = Hello.fromString(helloString); 

我建议你检查序列化(如许多其他有)或发现什么是你真正的问题,解决的最好办法它。

+0

序列化帮助我更好,谢谢您的解决方案! - 伊娃 – 2010-04-16 09:27:45

相关问题