web-dev-qa-db-ja.com

文字列をクラスオブジェクトに変換する

toString()メソッドを使用して、クラスオブジェクトを文字列に格納しています。次に、文字列をそのクラスオブジェクトに変換します。

どうやってするか?ソースコードを手伝ってください。

24
androidGuy

ToString()メソッドを使用して、クラスオブジェクトを文字列に格納しています。次に、文字列をそのクラスオブジェクトに変換します。

あなたの質問はあいまいです。それは少なくとも2つの異なることを意味する可能性があり、その1つは...まあ...あなたの重大な誤解です。


これをした場合:

_SomeClass object = ...
String s = object.toString();
_

その答えは、sSomeClassのインスタンスに戻す簡単な方法はないということです。 toString()メソッドがそれらのファンキーな "SomeClass @ xxxxxxxx"文字列の1つを与えたとしても、あなたはそれをすることができませんでした。 (この文字列は、オブジェクトの状態、またはオブジェクトへの参照さえもエンコードしません。xxxxxxxx部分は、オブジェクトのidentity hashcodeです。一意であり、オブジェクトへの参照に魔法のように戻すことはできません。)

toStringの出力をオブジェクトに戻す唯一の方法は次のとおりです。

  • SomeClass.toString()メソッドをコーディングして、オブジェクトに関連するすべての状態を、生成されたStringに含めます。
  • toString()メソッドによって生成された形式でStringを明示的に解析したコンストラクターまたはファクトリーメソッドをコーディングします。

これはおそらく悪いアプローチです。確かに、非自明なクラスに対してこれを行うのは大変な作業です。


このようなことをした場合:

_SomeClass object = ...
Class c = object.getClass();
String cn = c.toString();
_

次のように同じClassオブジェクト(つまり、cにあるオブジェクト)を取得できます。

_Class c2 = Class.forName(cn);
_

これによりClassが得られますが、それを使用して元のインスタンスを再構築する魔法の方法はありません。 (明らかに、クラスの名前にはオブジェクトの状態が含まれていません。)


任意のオブジェクトをシリアライズ/デシリアライズする方法を探している場合without自分でunparse/parseメソッドをコーディングする努力をするなら、あなたは- すべきではないtoString()メソッドを使用している。使用できるいくつかの選択肢があります。

  • @Nishantの回答のリンクに記載されているJava Object Serialization API。
  • @fatnjazzyの回答で説明されているJSONシリアル化。
  • XStreamのようなXMLシリアル化ライブラリ。
  • ORMマッピング。

これらのアプローチにはそれぞれ長所と短所があります...ここでは触れません。

27
Stephen C

はるかに簡単な方法:ストリーミングのためにオブジェクトをjson文字列に変換するにはcom.google.gson.Gsonが必要です

以下のコード用のストリーミング用にオブジェクトをJSON文字列に変換する

Gson gson = new Gson();
String jsonString = gson.toJson(MyObject);

Json文字列をオブジェクトに戻すには、次のコードを使用します。

Gson gson = new Gson();
MyObject = gson.fromJson(decodedString , MyObjectClass.class);

ストリーミングのためにオブジェクトを変換し、反対側で読み取るはるかに簡単な方法。お役に立てれば。 -ヴィシュシュ

18
user2516769
Class.forName(nameString).newInstance();
6
TurtleToes

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]

2
ajoumady

あなたはjsonでそれをしたいかもしれません。
Bean(*)をjsonに変換してから元に戻します。
このプロセスは、シリアライゼーションおよびデシリアライゼーションとして知られています
それについて読む こちら

(*)データソースとしてメンバーだけを使用しないでください。オブジェクトの各メンバーのゲッターとセッターを作成してください。

1
fatnjazzy

他の人が述べたように、あなたの質問はせいぜいあいまいです。問題は、オブジェクトを文字列として表現し、その文字列からオブジェクトを再構築できるようにすることです。

ただし、Javaの多くのオブジェクトタイプには文字列表現がありますが、これはオブジェクトが文字列表現から構築できることを保証するものではありません。

このソース を引用するには、

オブジェクトのシリアル化とは、オブジェクトの状態を一連のバイトに保存するプロセス、および将来のある時点でそれらのバイトをライブオブジェクトに再構築するプロセスです。

ですから、あなたが望むのは不可能かもしれません。ただし、オブジェクトの状態をバイトシーケンスに保存し、そのバイトシーケンスから再構築することは可能です。

1
K_U

私のコメントを続けます。 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
0
Nishant

ToString()を使用してクラスオブジェクトを文字列に格納することはできません。toString()はオブジェクトの文字列表現のみを返します。 Serialization について読んでみてください。

0
Erkan Haspulat

次のステートメントを使用できます。

Class c = s.getClass();

クラスインスタンスを取得します。

0
Anshul