2011-10-09 15 views
7

TimeZoneInfoオブジェクトのシリアル化に問題があります。 WCFサービスのデータコントラクトでTimeZoneInfo変数を使用しようとしましたが、シリアル化が失敗していました。だから、シリアル化をテストするためにこの小さなコードを書きました。私はwriteObjectメソッドを呼び出すときc#TimeZoneInfoシリアル化

 var fileName = "tmp.xml"; 
     var tz = TimeZoneInfo.Local; 
     var dataSer = new DataContractSerializer(typeof(TimeZoneInfo)); 

     try 
     { 
      using (var xml = new FileStream(fileName, FileMode.Create)) 
      { 
       dataSer.WriteObject(xml, tz); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 

は今、それが例外をスロー:

Type 'System.TimeZoneInfo+AdjustmentRule[]' with data contract name 'ArrayOfTimeZoneInfo.AdjustmentRule:http://schemas.datacontract.org/2004/07/System' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

私は [KnownType(typeof演算(System.TimeZoneInfo.AdjustmentRuleを[]追加しようとすると、ここで私が何をするかです))]クラスに私は同じエラーを取得します。私はコンパイルエラーを取得私のデータコントラクトインターフェイスに次の行を追加した場合と:

Error 1 'System.TimeZoneInfo.AdjustmentRule' is inaccessible due to its protection level

とドキュメントのTimeZoneInfoクラスに応じて、それはデフォルトでシリアル化する必要があるので、ISerializableを実装しています。

誰でも私がここで間違っていることを教えてもらえますか?助けていただければ幸いです。

ありがとうございました。

答えて

6

なぜ単純にシリアライズするだけではなく、IDをシリアライズするだけでよいのか分かりませんか?それはむしろより効率的になる可能性があります - そしてより簡単です! - 内部のすべての情報をシリアライズするよりも、両方のシステムがそのタイムゾーンを持っている限り、うまくいくはずです。

編集:カスタムタイムゾーンでは機能しません(他の場所で述べたようにToSerializedStringを参照してください)。

+1

私はその種の何かをしなければならないだろう周りうん、私は仕事として意味します。しかし、私は変数を強く型付けしたいと思っていますが、一般的に、なぜこれがうまくいかないのか不思議です。私はそれをシリアル化できない場合、ISerializableクラスのポイントは何ですか? – RedOctober

+1

@RedOctober:わかりません - それは奇妙に見えます。私は、DataContractSerializerが、ISerializableについて私が信じている*通常のBinarySerializerと同じ形式を使用しているかどうかを知るために、WCFについて十分に知りません。 IDだけをシリアル化すると、タイムゾーンを再度取得するときに、シリアル化時に知られていた情報ではなく、オペレーティングシステムから最新の情報が得られることに注意してください。これが良いかどうかは、あなたの状況によります。 –

+1

1.動作はフレームワークのバグのようです。 2.カスタムタイムゾーンを取得すると、IDで十分ではありません。回避策としてToSerializedStringメソッドを使用しました。 (http://msdn.microsoft.com/en-us/library/system.timezoneinfo.toserializedstring(v=vs.100).aspx) –

1

私はその理由もわかりません。 JonがIDを持つプロキシプロパティを提案したのは、おそらく行く方法です。

また、実際にTimeZoneInfoのコンテンツを送信してカスタムゾーンをサポートする必要がある場合は、ToSerializedString()FromSerializedString()をラップするプロキシプロパティを使用する必要があります。