質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

3530閲覧

デシリアライズ ファイルから読み込んだ値を文字に直したい

fgfnabwym

総合スコア78

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/23 11:34

ファイルからArrayListを読み込んでいるのですが、取得できる値が
Mem=[hello.Member@404b9385, hello.Member@6d311334]
というものです。

書き込みをした
Mem = [["sakura", 20]["tanpopo", 22)]]
この値を得るようにしたいのですが、その場合どのように書くといいのでしょうか。
そもそも読み込み方が間違っているのでしょうか。

Member.javaファイル

Java

1package hello; 2 3import java.io.Serializable; 4 5public class Member implements Serializable { 6 7 public String name; // 氏名 8 public int age; // 年齢 9 10 Member() { 11 this.name = ""; 12 this.age = 0; 13 } 14 Member(String name, int age) { 15 this.name = name; 16 this.age = age; 17 } 18 19 20}

SerializableSampleTest.javaファイル

Java

1package hello; 2import java.io.FileInputStream; 3 4import java.io.FileOutputStream; 5import java.io.IOException; 6import java.io.ObjectInputStream; 7import java.io.ObjectOutputStream; 8import java.util.ArrayList; 9import java.util.List; 10 11 12public class SerializableSampleTest { 13 public static void main(String[] args) { 14 SerializableSampleTest sst1 = new SerializableSampleTest(); 15 16 List<Member> mb1 = new ArrayList<Member>(); 17 // 一人目 18 mb1.add(new Member("sakura", 20)); 19 // 二人目 20 mb1.add(new Member("tanpopo", 22)); 21 sst1.write(mb1); 22 23 sst1.read(); 24 } 25 26 public void write(java.util.List<Member> Mem) { 27 // シリアライズ 28 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("member", true))) { 29 oos.writeObject(Mem); 30 System.out.println("シリアライズ完了"); 31 oos.close(); 32 33 } catch (IOException e) { 34 System.out.println("error"); 35 e.printStackTrace(); 36 } 37 } 38 39 public java.util.List<Member> read(){ 40 List<Member> Mem = new ArrayList<Member>(); 41 42 // デシリアライズ 43 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("member"))) { 44 Mem = (ArrayList) ois.readObject(); 45 System.out.println("Mem="+Mem); 46 for(int i=0; i<Mem.size(); i++) { 47 System.out.println(Mem.get(i)); 48 } 49 50 System.out.println("デシリアライズ完了"); 51 ois.close(); 52 } catch (IOException | ClassNotFoundException e) { 53 System.out.println("error"); 54 e.printStackTrace(); 55 } 56 return Mem; 57 } 58 59 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Memberクラスの toString メソッドを、以下のようにオーバーライドしてください。

java

1package hello; 2 3import java.io.Serializable; 4 5public class Member implements Serializable { 6 7 // 中略 8 9 @Override 10 public String toString() { 11 return "[\"" + name + "\", " + age + "]"; 12 } 13 14}

実行結果

シリアライズ完了 Mem=[["sakura", 20], ["tanpopo", 22]] ["sakura", 20] ["tanpopo", 22] デシリアライズ完了

ご質問のコードで得られるhello.Member@404b9385という値は、Object クラスの toString メソッドの実行結果です。
http://docs.oracle.com/javase/jp/7/api/java/lang/Object.html#toString()

クラス Object の toString メソッドは、オブジェクトがインスタンスになっている元のクラスの名前、アットマーク文字「@」、およびオブジェクトのハッシュコードの符号なし 16 進数表現から構成される文字列を返します。つまり、このメソッドは次の値と等しい文字列を返します。

getClass().getName() + '@' + Integer.toHexString(hashCode())

System.out.println("Mem="+Mem);という一文が実行されたとき、ArrayListインスタンスの変数Memが、自身に格納されている各要素の toString メソッドを呼び出します。
http://docs.oracle.com/javase/jp/7/api/java/util/AbstractCollection.html#toString()

このコレクションの文字列表現を返します。文字列表現は、コレクションの要素をそのイテレータが返した順に角括弧 ("[]") で囲んで示すリストです。隣接する要素は、文字 ", " (カンマと空白文字) によって区切られます。要素は、String.valueOf(Object) により文字列に変換されます。

そのため、ご質問の値が得られた、というわけです。

投稿2016/11/23 12:05

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fgfnabwym

2016/11/23 12:17

詳しい回答ありがとうございます。助かりました。
guest

0

ベストアンサー

取得は出来ています。出力したいならば、例えば次のように記述すればよいでしょう。

// 修正例 for (int i = 0; i < Mem.size(); i++) { Member m = (Member) Mem.get(i); System.out.println(m.name); System.out.println(m.age); }

以下、出力結果。

シリアライズ完了 Mem=[test56277.Member@14ae5a5, test56277.Member@131245a] sakura 20 tanpopo 22 デシリアライズ完了

投稿2016/11/23 11:54

java-beginner

総合スコア452

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fgfnabwym

2016/11/23 12:18

素早い回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問