WCFのサービスで、戻り値や引数に自分で作ったクラスを使うときに、クラスにDataContractとかDataMenber属性をつけたりしないといけない。
これって何だろう??というところから調査スタート。
DataContractSerializer
結論から言うと、DataContract属性やDataMember属性は、DataContractSerializerという新しいクラスで使われるものらしい。
このクラスは、System.Runtime.Serializationを参照に追加することで使えるようになる。
コンソールアプリケーションでDataContractSampleというプロジェクトを作って参照を追加して試してみよう。
まず、いつものPersonクラスを作成する。
この段階では、まだ属性はつけていない。
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
}
こいつに属性をつけていく。
つける属性は、System.Runtime.Serialization.DataContractとSystem.Runtime.Serialization.DataMemberの2つになる。
DataContractはクラスに、DataMemberはプロパティに付け足す。
[System.Runtime.Serialization.DataContract]
public class Person
{
[System.Runtime.Serialization.DataMember]
public int ID { get; set; }
[System.Runtime.Serialization.DataMember]
public string Name { get; set; }
}
属性をつけたら、以下のようなコードでXML形式へシリアライズできる。
// コンストラクタにターゲットの型を渡す
var ds = new DataContractSerializer(typeof(Person));
// 出力先を作成
var sw = new StringWriter();
var xw = new XmlTextWriter(sw);
// 人間に優しい見た目にして
xw.Formatting = Formatting.Indented;
// いざXMLへ!
ds.WriteObject(xw, new Person { ID = 1, Name = "田中 太郎" });
// 結果確認
Console.WriteLine(sw);
実行結果
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/DataContractSample">
<ID>1</ID>
<Name>田中 太郎</Name>
</Person>
ばっちりだ。もちろんXMLからクラスのインスタンスへ復元も可能。
さっきのコードに続けて、以下のようなコードでXMLからオブジェクトのインスタンスへ復元できる。
// デシリアライズ
var sr = new StringReader(sw.ToString());
var xr = new XmlTextReader(sr);
var person = (Person)ds.ReadObject(xr);
Console.WriteLine("ID:{0}, Name:{1}", person.ID, person.Name);
実行結果
ということでDataContractのまとめ。
- DataContractSerializerで使われる
- System.Runtime.Serializationを参照に追加することで使用可能。
- DataContractをクラスへ、DataMemberをプロパティへつける。
- DataContractSerializerのWriteObjectでシリアライズ、ReadObjectでデシリアライズできる
以上、超簡単な使い方でした。
ICEfacesを超軽く触ってみた。
ものとしては、非常によくできたものだとおもう。
Webアプリケーションに、ありがちな画面遷移時の画面のちらつきもない。
だけど、いくつか気になるところがあった。
画面のタイトルが設定されない
下の図のように、ページにタイトルを設定してるのに、実行してみるとタイトルが設定されてない。
実際に実行してみた結果。タイトルは設定されていない。
画面遷移しないが故に
画面遷移もAjaxでやってしまってるICEfaces。
そのため、戻るボタンが使えない。
利点でもあり欠点でもある。
抑止したい場面は、あるけど、出来なくなることには若干抵抗があるかも。
画面遷移しないが故に2
画面遷移もAjaxでしてるせいで、bodyのonloadイベントが発生しない。
例えば、Page1→Page2に画面遷移するときに、Page2のonloadイベントは発生しない。
動かないものもある
GlassFish v2, GlassFish v3, Tomcat6でプロジェクトを作って動かしたところ、GlassFish v3では、サーバーサイドで何かエラーが出ていて動かせなかった。
正式版では動いてくれることを期待です。
なんとなく思ったこと
ICEfacesを使うと、完璧な?Ajaxアプリケーションが出来てしまう。
そのため、既存のWebアプリで培ってきたノウハウで使えないものも出てきそうだと思う。