かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

2008年12月21日 #

[C#][WCF]DataContractって

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

実行結果

ID:1, Name:田中 太郎

ということでDataContractのまとめ。

  • DataContractSerializerで使われる
  • System.Runtime.Serializationを参照に追加することで使用可能。
  • DataContractをクラスへ、DataMemberをプロパティへつける。
  • DataContractSerializerのWriteObjectでシリアライズ、ReadObjectでデシリアライズできる

以上、超簡単な使い方でした。

posted @ 20:17 | Feedback (1219)

[NetBeans]ICEfacesを触ってみて気づいたこと

ICEfacesを超軽く触ってみた。
ものとしては、非常によくできたものだとおもう。

Webアプリケーションに、ありがちな画面遷移時の画面のちらつきもない。

だけど、いくつか気になるところがあった。

画面のタイトルが設定されない

下の図のように、ページにタイトルを設定してるのに、実行してみるとタイトルが設定されてない。
image

実際に実行してみた結果。タイトルは設定されていない。
image

 

画面遷移しないが故に

画面遷移もAjaxでやってしまってるICEfaces。
そのため、戻るボタンが使えない。

利点でもあり欠点でもある。

抑止したい場面は、あるけど、出来なくなることには若干抵抗があるかも。

 

画面遷移しないが故に2

画面遷移もAjaxでしてるせいで、bodyのonloadイベントが発生しない。
例えば、Page1→Page2に画面遷移するときに、Page2のonloadイベントは発生しない。

 

動かないものもある

GlassFish v2, GlassFish v3, Tomcat6でプロジェクトを作って動かしたところ、GlassFish v3では、サーバーサイドで何かエラーが出ていて動かせなかった。
正式版では動いてくれることを期待です。

なんとなく思ったこと

ICEfacesを使うと、完璧な?Ajaxアプリケーションが出来てしまう。
そのため、既存のWebアプリで培ってきたノウハウで使えないものも出てきそうだと思う。

posted @ 0:58 | Feedback (12)