2013-05-30 2 views
5

の実装を持っている必要がありますので、私は次のコードを持っている:C#の:XMLシリアル化可能であるために、IEnumerableを継承タイプが追加(System.Objectの)

private static string FindAppointmentsAsXmlString(CalendarView calendar, ExchangeService serv) 
     { 
      FindItemsResults appointments = 
       serv.FindAppointments(WellKnownFolderName.Calendar, calendar);

var serializer = new XmlSerializer(appointments.GetType()); var writer = new StringWriter(); try{ serializer.Serialize(writer, appointments); Console.WriteLine(writer.GetStringBuilder().ToString()); Console.ReadLine(); } catch (Exception ex) { Console.WriteLine(ex); Console.ReadLine(); } return writer.GetStringBuilder().ToString(); }

をシリアライザを初期化するとき、私は例外を取得します:

XML直列化可能であるためには、IEnumerableから継承する型は継承階層のすべてのレベルで のAdd(System.Object)実装を実装する必要があります。

Microsoft.Exchange.WebServices.Data.FindItemsResultsは、Add(System.Object)を実装していません。

私は検索しましたが、私はパブリックのAdd(Object obj)メソッドを追加する必要があるという結論に達しました。今私は本当にこのメソッドが含まれるべきか、それが呼び出されるべきかわからない、誰かが正しい方向に私を向けることができますか? Addメソッドは、各予定を手動で追加する必要がありますか?

Iが役に立ったと評価していくつかのリンク:感謝 here here

答えて

3

Add()メソッドは、IEnumerableオブジェクト内の要素の型の単一引数を持つ必要があります。たとえば、FindItemsResultsIEnumerable<T>を実装する場合、メソッドvoid Add(T value)を追加できます。 FindItemsResultsを読み取り専用にする場合は、FindItemsResultsToList()拡張メソッド経由でリストに変換し、FindItemsResultsオブジェクト自体ではなくリストをシリアル化することができます。

+0

ああ..右。私は今それを試し、あなたに戻ってきます。 :) – LKB

+0

FindItemsResults の予定をリストに変換し、その代わりにシリアライズしました。ただし、今は例外が発生しています。** Microsoft.Exchange.WebServices.Data.Appointmentは、パラメータ化されたコンストラクタ**がないため、シリアル化できません。何か案は? – LKB

+0

FindItemsResultsオブジェクトグラフの何かがXmlSerializerで直接シリアル化できないため、おそらくこのエラーが発生しています。もう少し堅牢なDataContractSerializerを試すか、FindItemsResultsobjectグラフをよりシンプルな形式(POCO DTO)にすることができます。 –

1

FindItemsResultとそれによって生成されたオブジェクトを逆シリアル化するときに、IEnumerableに格納されている型のオブジェクトをIEnumerableに戻すことができるAddメソッドを実装する必要があります。 IEnumerableはListと似ていないため、逆シリアル化された項目は、一般的には何らかの種類のコンテナに戻すことはできません。 IEnumerableを実装するクラスをどのように実装するかを知る方法はないため、明示的にAddメソッドを記述する必要があります。

+0

:ここ

は、私はIEnumerableを実装したクラスに追加するものです。 **編集:**私はAddメソッドを呼び出さなかった - どうすればいいですか? var serializer =新しいXmlSerializer(appointments.GetType()。Add());?いいえ、それはうまくいきません... – LKB

+0

addメソッドはObjectクラスのオブジェクトを引数として受け取りますか? IEnumerableを実装しているオブジェクトを逆シリアル化しようとすると、addメソッドが自動的に呼び出されると思います。 –

1

ページングされた結果オブジェクトを作成するときに同じ問題が発生しました。選択された答えは基本的には正しいですが、私はちょうどそれを少し上手くフォーマットし、自分のヒントを追加すると思った。

基本的に私はAddを実装しましたが、私はそれを読み込み専用にしたい結果セットとして以来、それを呼び出そうとするかもしれない将来の開発者を案内する例外をスローしました。シリアライザはまだ正常に動作しているので、明示的にはシリアライズ時にAddを呼び出すことはありません。デシリアライザの問題に遭遇するかもしれませんが、このオブジェクトは純粋に結果セットを取得するためのものなので、すべてがうまくいくはずです。あなたが述べたように、私は残念ながら同じ例外がまだ発生し、Addメソッドを実装し

public void Add(T value) 
    { 
     throw new NotSupportedException("Add is not supported for paged results. Try adding new items to the repository instead."); 
    } 
関連する問題