スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

JSON形式でオブジェクトをデシリアライズする

JSON形式でオブジェクトをシリアライズする
で、クラスをシリアライズする方法をメモったけど、逆に取り込む方を書いていなかった。
操作的には逆、というか、Writeメソッドの代わりにReadメソッドを使うだけ。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Runtime.Serialization.Json;

namespace TawamureDays {

public static class Utils {

/// <summary>
/// 指定されたファイル(JSON形式)から、内容をデシリアライズして
/// オブジェクトを取得します。<br/>
/// </summary>
/// <remarks>
/// 指定されたファイルの内容(JSON形式)をデシリアライズし、
/// 指定した型のオブジェクトとして取得します。<br/>
/// 注意:<br/>
/// ここで使用するシリアライザは、DataContract属性及びDataMember属性を
/// 付けているクラス、プロパティのみに有効に働きます。<br/>
/// 上記属性を使う場合は、System.Runtime.Serialization.dllを参照設定に加え、
/// System.Runtime.Serializationをusingしてください。<br/>
/// </remarks>
/// <typeparam name="T">デシリアライズ対象の型宣言</typeparam>
/// <param name="filePath">読込元のファイルパス</param>
/// <returns>デシリアライズされたオブジェクト</returns>
/// <exception cref="FileNotFoundException">指定されたファイルパスが存在しないとき</exception>
/// <exception cref="InvalidOperationException">オブジェクトをデシリアライズできない時</exception>
public static T DeserializeFromJson<T>(string filePath) {
if (!File.Exists(filePath)) {
throw new System.IO.FileNotFoundException(
"指定のファイルが存在しません", filePath);
}


//デシリアライザセット
var serializer = new DataContractJsonSerializer(typeof(T));
T obj = default(T);

if (new FileInfo(filePath).Length == 0) {
return obj;
}

//出力
MemoryStream memStr = null;

try {
//メモリストリームに取り込んでからデシリアライズを行います。
using (memStr = new MemoryStream(
Encoding.UTF8.GetBytes(
File.ReadAllText(filePath, Encoding.UTF8)))) {

System.Xml.XmlDictionaryReader xmlReader = null;

try {
using(xmlReader =
JsonReaderWriterFactory.
CreateJsonReader(memStr,
System.Xml.XmlDictionaryReaderQuotas.Max)) {
obj = (T)serializer.ReadObject(xmlReader);
}

} finally {
if (xmlReader != null) {
GC.SuppressFinalize(xmlReader);
xmlReader = null;
}
}
}

} finally {
serializer = null;
}

return obj;
}
}
}

・シリアライズ/デシリアライズしたいクラスにDataContract(System.Runtime.Serialization)属性をつける必要がある。
・プロパティには更にDataMember(System.Runtime.Serialization)属性をつける必要がある。付けていないプロパティは対象外になる。
・後付けで追加したプロパティは、DataMemberのIsRequiredプロパティをfalseに設定しておいたほうが無難。
だいたい↓みたいな感じ

[DataContract(Namespace="TawamureDays")]
public class PersonData : BaseViewModel {

[DataMember(IsRequired=true, Order=0)]
public string FirstName { get; set; }

[DataMember(IsRequired=true, Order=2)]
public string SecondName { get; set; }

[DataMember(IsRequired=true, Order=2)]
public int Age { get; set; }

[DataMember(IsRequired=true, Order=3)]
public DateTime Birthday {get; set;}
}

使い方

//ファイルパス(拡張子は適当)
var PersonsList = new List(3) {
new PersonData {FirstName = "太郎",
SecondName = "田和牟礼",
Age=20, Birthday = DateTime.Today.AddYears(-20)}
,new PersonData {FirstName = "二郎",
SecondName = "田和牟礼",
Age=16, Birthday = DateTime.Today.AddYears(-16)}
,new PersonData {FirstName = "三郎",
SecondName = "田和牟礼",
Age=12, Birthday = DateTime.Today.AddYears(-12)}
};

var path = @"C:\Users\Tawamure\Desktop\PersonsList.json";
//シリアライズ(ファイルへの書き出し)
//主に画面終了時とかに使いたい。
Utils.SerializeToJson(PersonsList.ToArray(), path);
...
//デシリアライズ(ファイルから取り込み)
//主に画面起動時に使いたい。
var list = Utils.DeserializeFromJson(path);

画面のサイズや位置、DataGridの列位置や幅等を記憶したい時に使った。
別にXMLファイルでも良かったんだけどね。どうせならってんでJSONにしてみた。

(追記)
XMLシリアライズと比較。
・ファイルサイズは、JSON形式の方が小さい。
・XML形式は、除外するプロパティに属性(System.Xml.Serialization.XmlIgnore)をつけていたのに対して、JSONは対象とするプロパティに属性をつける。
・デシリアライズに関する処理は、XML形式の方が融通が効く。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。