バイナリ シリアライザについて

オブジェクトをシリアライズする時に、どのシリアライザを使用するかによってデータの互換性を含めて、様々な問題が発生することがあります。.NET Framework や Mono を使った開発で、利用するシリアライザの種類を列挙します。 バイナリ シリアライザBinaryFormatter が標準で組み込まれていますので、使われるケースが多いと思われます。標準以外にも様々なシリアライザが OSS として開発されていたりします。 XML シリアライザDataContractFormatter が標準で組み込まれています。 JSON シリアライザ標準で用意されているシリアライザを使用したり、Json.net を使用することが多いと思います。 バイナリ シリアライザを使用する時の資料は、MSDN ライブラリに掲載されています。バイナリ シリアライザを使用する時の注意は、以下の点になります。 シリアライズするクラスの型を持つアセンブリをライブラリにすること。 後日にクラスにメンバーを追加した場合は、バージョン トレラントを確保すること。 バイナリ シリアライズで作成されたバイナリ データには、「アセンブリ識別子(アセンブリ名、バージョン、カルチャ、パブリック トークン)」と「型の完全名(名前空間。クラス名)」、「シリアライズするフィールド名」と「データ」が記録されています。クラスという型の情報は、アセンブリのType Definition で定義されており、デシリアライズする時に型情報が一致しないとデシリアライズが失敗します。この理由で、シリアライズする型を定義するアセンブリをライブラリにしておくことで、デシリアライズのエラーを削減できるようになります。 シリアライズの基本的な使い方 シリアライズ対象になるクラスが、SerializeSample というアセンブリで、Person クラスが以下のように定義されていたとします(シリアライザは、内部でリフレクションを使用しています。リフレクション API が変更されると、その影響を受けることもあります)。 using System; namespace SerialSample { [Serializable] public class Person { public Person() { } public string Name { get; set;…

0

XAML とは何か?

今更ですが、XAMLとな何なのかということを私なりに解説したいと思います。このような考えに至ったのは、色々な状況があるにせよ Windows Froms などの UI 技術が広く使われているのと、XAML を初めて学ぼうとしたときに書籍を含めて、新しい情報が少ないと感じたからです。 2014/12に追記XAML の詳細を学習するには、XAML Deep Dive for Windows & Windows Phone App Jump Start という動画を参考にするのも良いかもしれません。日本語の字幕はありませんが、英語の字幕がありますので、斜め読みでも XAML を使ったことがある人にとっては役に立つと考えられます。 XAML が登場した背景 XAML(eXtensible Application Markup Language)は、.NET Framework 3.0 によって提供された技術になります。 .NET Framework 3.0 は、Windows Vista と同時に提供されたフレームワークになります。この時に、UI を作るための技術として WPF(Windows Presentation Foundation) とワークフローを実現する技術として WF(Windows Workflow Foundation) も提供されました。WPF は、UI を定義するために XAML を採用しており、XAML が UI 技術と考えがちですが、名前にアプリケーションが含まれていることから WF でもワークフロー定義として…

0

テスト用の証明書の有効期限を更新するには

Silverlight の XAP や ClickOnce で使用する自己署名用の証明書の有効期限が切れた場合に、makecert.exeを使って新しい証明書を作成して使用すると証明書の不一致が発生します。こうなると、以前のアプリケーションをアンインストールしてから新しいアプリケーションをインストールする必要があります。この問題を避けるには、証明書の更新要求を行ってから、証明書を証明機関(CA)から発行してもらう必要があります。一般的に商用のコード署名用の証明書の有効期間は、1年か、長いものでも3年になります。テスト用の自己署名用の証明書の場合は、証明書の更新をmakecer.exeはサポートしていません。この問題に対する記事としては、以下のものがあります。 You receive an error message when you try to update a Visual Studio 2005 ClickOnce application after the certificate that was used to sign the installation expires ClickOnceのデジタル証明書を更新するには?[VS 2005のみ、2.0のみ、C#、VB] どちらの記事も Visual Studio 2005 のものになりますし、作成したプログラムの実行には VC 2005のランタイムが必要になります。VC 2005 のランタイムをインストールしていない環境でそうしようかと考えて、証明書の作成を C# で行うサンプルがないかと探していたら、以下の記事がありました。 Creating a self-signed certificate in C# この記事に添付されている Certificate.cs と…

0

Silverlight アプリケーションのマネージヒープを調べるには

Silverlight アプリケーションパフォーマンスを調べたりするには、以下のような方法があります。 プロファイリングを行う(プロファイラ API を利用する) Visual Studio 2010 SP1 で強化されたパフォーマンス分析を利用する マネージヒープに確保されたオブジェクトのメモリサイズなどを調べるには、SOS デバッガ拡張を使用することができます。SOS デバッガ拡張が使えることをご存じの方もいらっしゃることでしょう。今回は、SOS デバッガ拡張を使って Silverlight アプリケーションのマネージヒープの調べ方をご紹介します。必要になるツールは、Windows デバッガ(WinDbg)です。Windows デバッガは、Windows SDK に含まれていますので Windows SDK を導入する必要があります。 Microsoft Windows SDK for Windows 7 and .NET Framework 4 (Windows SDK 7.1) Download and Install Debugging Tools for Windows 上記に示した URL から該当する Windows SDK をダウンロードしてください。ここでは、Windows 7 x64 環境に Windows SDK 7.1…

0

Silverlight 4 Toolkit の Silverlight5 へのマイグレーションについて

Silverlight 4 Toolkit は、ソースコードが公開されているコントロール集です。昨年に Silverlight 5 が公開されたこともあって、Toolkit を Silverlight 5 用に移行を検討している方もいらっしゃることでしょう。ソースコードを修正している場合は、Silverlight 5 Toolkit のソースコードを修正するか、Silverlight 4 用のプロジェクトを Silverlight 5 用に移行する必要があります。今回は、Silverlight 4 Toolkit のプロジェクトを Silverlight 5 プロジェクトに移行する方法を簡単に説明します。移行作業を行う前に、考慮しないといけないことがあります。それは、以下のようなプロジェクトです。 Silverlight.Control.Sdk ソリューション:System.Windows.Controls プロジェクト、System.Windows.Controls.Input プロジェクト RiaClient.Sdk ソリューション:System.ComponentModel.DataAnnotations プロジェクト、System.Windows.Controls.Navigation プロジェクト、System.Windows.Data プロジェクト、System.Windows.Controls.Data プロジェクト 上記に含まれるプロジェクトが生成するアセンブリは、Silverlight 5 SDK が標準提供するように変更されています。つまり、これらのアセンブリに依存する箇所は、Silverlight 5 SDK のものに切り替える必要があります。これを踏まえて、移行に必要なものを以下に示します。 Silverlight 4 Toolkit April 2010のソースコード Silverlight 5 Toolkit December 2011のソースコード 事前準備として、Silverlight 5 Toolkit…

0

Silverlight から Azure Table Storage Service へダイレクトにアクセスするには

Silverlight から、Windows Azure の Table ストレージ サービスを利用する方法を検討してみました。考えられる方法は、以下が考えられます。 Web サービスを経由してアクセスする RIA サービス(内部で Table ストレージを使用する) — Silverlight クライアント Web サービス側では、Azure SDK のストレージ クライアント ライブラリを使用できる ダイレクトにアクセスする Table ストレージ サービス — Silverlight クライアント Table ストレージは OData 形式なので、 WCF Data サービス クライアントが使えるかも RIA サービスを使った Table ストレージの利用方法は、探せばサンプルが見つかることでしょう。ここでは、残りの WCF Data サービス クライアントを使う方法を検討します。最初に検討しないといけないのが、リクエスト ヘッダーに対して情報を追加することが可能かという点です。これに関しては、System.Data.Services.Client.DataServiceContext クラスが SendingRequest イベントを公開しているので、このイベントを使用すればできそうです。 SendingRequest イベントは、 引数として sender (DataServiceContextクラス) と…

0

XAP をオンデマンドで読み込みには

Silverlight 4ベータSDKには、Managed Extensibility Framework(MEF)が含まれています。MEFを簡単に説明するとすれば、Composite Application を作成するためのフレームワークで、最新のモノはCodePlexで公開されています。このMEFとSilverlight Toolkitに含まれるSystem.ComponentModel.Coposition.Packaging.Toolkit.dllを組み合わせると、別のXAPをダウンロードして複合化(Composition)アプリケーションに仕上げることができます。このPackaging.Toolkitに含まれるPackageクラスを使って、自分で外部のXAPを読み込む方法をご紹介します。外部のパッケージを読み込むには、以下のようなコードを記述します。  Package package; // イベントハンドラ private void btnDownload_Click(object sender, RoutedEventArgs e) { Uri uri = new Uri(“ExternalXap1.xap”, UriKind.Relative); Package.DownloadPackageAsync(uri, (args, p) => package = p ); }   PackageクラスのDownloadPackageAsyncメソッド呼び出せば、ラムダ式に記述したようにpackage変数にダウンロードしたXAPに関する情報が格納されます。格納されたPackageクラスのインスタンスには、以下のようなプロパティがあります。 Uriプロパティ:指定したXAPのUriです。 Assemblies:XAPに含まれるAppManifest.xamlのAssemblyPartで定義されているアセンブリをインスタンス化したコレクションです。 Packageクラスのインスタンスが手に入れば、クラスのインスタンスを作成するには以下のようにします。  foreach (var asm in package.Assemblies) { // 該当するアセンブリを見つけた場合 object obj = asm.CreateInstance(“クラス名”); // 作成したインスタンスを使って何かの処理を行います } このPackageクラスのDownloadPackageAsyncメソッドを調べると以下のようなことを行っているのを理解することができます。 WebClientクラスを使ってXAPの読み込み。…

0

Silverlight3 での WCF エラーの扱い方について

昨日は、わんくま同盟の勉強会に参加していました。ここであった質問に、Silverlight で WCFサービスのエラーを処理するにはどうしたら良いかというものがありました。基本的には、SDKドキュメントに記述があるのですが、なかなか知られていないのかなと思いました。 Silverlight 3で WCFのエラーを処理するには、WCFサービス側でビヘイビアを実装する必要があります。このビヘイビアでは、以下の2つの機能を実装する必要があります。 HTTPステータスを「200OK」に変更する。 SDKでは、SilverlightFaultMessageInspector.BeforeSendReplyメソッドで行っています。 ApplyDispatchBehaviorメソッドで、MessageInspectorsにSilverlightFaultMessageInspectorを追加する。 カスタムビヘイビアの準備ができたら、サービス側のエンドポイントビヘイビアに組み込みます。 サービスが出来上がれば、Silverlight側ではCompletedメソッドにエラー処理を組み込めば完了です。この場合は、try catchでエラーを補足するのではなく、イベント引数のErrorプロパティを使用します。「FaultExeption<ExceptionDetail> falut = e.Error as FaultExeption<ExceptionDetail>」のようにFaultExceptionへキャストしてから、Detailプロパティを使ってエラー内容にアクセスすることができるようになります。 WCFサービス側でエラー用のカスタムベヘイビアを作成していない場合は、HTTPステータスが500で返ってきます。この場合は、try catchでエラーを補足できますが、CommunicationExceptionとしか認識することができません。この理由から、HTTPステータスを200OKにする必要があります。Silverlight2の場合も考え方は同じなのですが、 FaultExeptionクラスなどがSilverlight3ほど用意されていませんので、自分で実装する必要がありました。 これらの理由は、Silverlight向けのWCF実装が.NET Framework向けのサブセットであり機能を縮小しているからです。WCFのフルセットであれば、try catchでエラーを補足してSOAP例外を取り出すことができますが、Silverlight向けのサブセットには含まれていないためです。

0