在Java中将类强制转换为字符串,反之亦然

在Java中将类强制转换为字符串,反之亦然,java,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";

我有一个程序,在其中我需要通过将类对象转换为字符串来将其存储到内存中。是否可以将字符串转换回原始类,以便使用该类变量?我正在用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

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

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

序列化和反序列化:

序列化和反序列化:
这可能会有帮助:

编辑添加

toString()
与序列化不同。那只是对阶级的描述;列出该类的特定实例的一些值等。

这可能会有帮助:

编辑添加


toString()
与序列化不同。那只是对阶级的描述;列出该类的特定实例的一些值等等。

我认为您要做的是序列化。我对你的评论感到困惑:

  // Now I need to convert String s into type hello so that 
          // I can do this:
          // (hello)s.h1;
          // (hello)s.h2;   
不能将字符串对象强制转换为任意类类型。也许你可以详细说明你在这里想要完成什么。如果希望能够将类“保存”到文件中,然后将其作为对象读回,则需要序列化。像这样:

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);

  }
}

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

我认为您要做的是序列化。我对你的评论感到困惑:

  // Now I need to convert String s into type hello so that 
          // I can do this:
          // (hello)s.h1;
          // (hello)s.h2;   
不能将字符串对象强制转换为任意类类型。也许你可以详细说明你在这里想要完成什么。如果希望能够将类“保存”到文件中,然后将其作为对象读回,则需要序列化。像这样:

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);

  }
}

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

如果您复制了对象hello,则不必担心更改回原始对象

 Hello h = new Hello();

 Hello copyH = h;

如果复制对象hello,则不必担心更改回原始对象

 Hello h = new Hello();

 Hello copyH = h;
我有一个计划,我需要 通过以下方式将类对象存储到内存中

创建一个对象后,它已经位于内存中,如果您想缓存它,可以将其放入HashMap中供以后访问

把它铸成线

没有从字符串到对象的转换,反之亦然

可以转换字符串吗 回到原来的班级,让我 可以使用那个类变量吗

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

  • 将成员打印为字符串,并使用StringTokenizer拆分字符串并分配(这可能需要转换字符串以外的数据类型)

  • 使用类似

  • 使用XML作为对象状态的字符串表示。在java中,您可以使用我更喜欢的语言

我有一个计划,我需要 通过以下方式将类对象存储到内存中

创建一个对象后,它已经位于内存中,如果您想缓存它,可以将其放入HashMap中供以后访问

把它铸成线

没有从字符串到对象的转换,反之亦然

可以转换字符串吗 回到原来的班级,让我 可以使用那个类变量吗

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

  • 将成员打印为字符串,并使用StringTokenizer拆分字符串并分配(这可能需要转换字符串以外的数据类型)

  • 使用类似

  • 使用XML作为对象状态的字符串表示。在java中,您可以使用我更喜欢的语言


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


当然,如果您不一定需要对象的字符串表示,您应该像其他人建议的那样研究序列化。

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


当然,如果您不一定需要对象的字符串表示,您应该像其他人建议的那样研究序列化。

如果您确实需要这样做,您可以重写类中的toString()方法并创建静态方法(或创建转换器类)从其toString()返回Hello对象。大概是这样的:

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);
我鼓励您检查序列化(正如许多其他人所做的那样),或者找出真正的问题所在以及解决问题的最佳方法