2016-04-19 9 views
1

EKEventを格納する単純なリストを直列化しようとすると、EKEventを使用したリストをXamarin.iOSのJSONにシリアル化する

Newtonsoft.Json.JsonSerializationException: Self referencing loop detected for property 'Self' with type 'Foundation.NSDate'. Path '[0].EndDate'. at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CheckForCircularReference (Newtonsoft.Json.JsonWriter writer, System.Object value, Newtonsoft.Json.Serialization.JsonProperty property, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerProperty) [0x00105] in :0 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter. CalculatePropertyValues (Newtonsoft.Json.JsonWriter writer, System.Object value, Newtonsoft.Json.Serialization.JsonContainerContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonProperty property, Newtonsoft.Json.Serialization.JsonContract& memberContract, System.Object& memberValue) [0x000c7] in :0 at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject (Newtonsoft.Json.JsonWriter writer, System.Object value, Newtonsoft.Json.Serialization.JsonObjectContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract collectionContract, Newtonsoft.Json.Serialization.JsonProperty containerProperty) [0x0003c] in :0

これはJsonConvert.SerializeObjectメソッドを使用しようとしたときに発生します。 EKEventリストをシリアル化するための回避策はありますか?

EDIT

JsonSerializerSettingsの作品を使用して!

Newtonsoft.Json.JsonSerializationException:タイプEventKit.EKEventに使用するコンストラクタが見つかりません私は、オブジェクトをDeserialiseしようとすると、

はしかし、私は別の問題を取得します。 @ クラスにはデフォルトのコンストラクタ、つまり の引数を持つ1つのコンストラクタか、またはJsonConstructor属性でマークされたコンストラクタが必要です。 Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject (Newtonsoft.Json.JsonReaderリーダ、Newtonsoft.Json.Serialization.JsonObjectContract objectContract、 Newtonsoft.Jsonでパス '[0] .ClassHandle'、行1、位置16 。 Serialization.JsonProperty containerMember、 Newtonsoft.Json.Serialization.JsonProperty containerProperty、 可能System.String IDを、可能System.Boolean & [0x000d6]でcreatedFromNonDefaultCreator):Newtonsoft.Json.Serialization.JsonSerializerInternalReaderで0 。 CreateObject(Newtonsoft.Json.JsonReaderリーダー、System.Type objectType、Newtonsoft.Json.Serialization.JsonContractコントラクト、Newtonsoft.Json.Serialization.JsonPropertyメンバ、Newtonsoft.Json.Serialization.JsonContainerContract containerContract、Newtonsoft.Json.Serialization.JsonProperty containerMember 、System.Object existingValue)[0x0013b]:0 、Newtonsoft.Json.Serialization.JsonSerializerInternalReader。 CreateValueInternal(Newtonsoft.Json.JsonReaderリーダ、System.TypeをobjectTypeに 、Newtonsoft.Json.Serialization.JsonContract契約、Newtonsoft.Json.Serialization.JsonProperty部材、 Newtonsoft.Json.Serialization.JsonContainerContract containerContract、Newtonsoft.Json.Serialization。 JsonProperty containerMember、System.Object existingValue)[0x0006d] in:0 、Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IListリスト、 Newtonsoft.Json.JsonReaderリーダー、Newtonsoft.Json.Serialization.JsonArrayContractコントラクト、 Newtonsoft.Json .Serialization.JsonProperty containerProperty、System.String id)[0x000cb] in:0

答えて

1

EKEventには再帰があるため、エラーが発生していますプロパティの参照があります。あなたが持っていないようにすべての呼び出しのためにそれを指定するには、あなたはまた、世界的にシリアライザの設定値を設定することができます

JsonConvert.SerializeObject(myList, new JsonSerializerSettings 
          { 
           ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
          }); 

:あなたはJSONシリアライザは、自己参照のループを無視するように指定するReferenceLoopHandling設定を使用することができます

JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
{ 
    ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
}; 

あなたはJson.NETのドキュメントで完全な例を見ることができます:http://www.newtonsoft.com/json/help/html/ReferenceLoopHandlingIgnore.htm

+0

ありがとうございます!シリアライザの問題を解決しました。しかし、Deserialiseにしようとすると、別の問題が発生します。これを私の質問に追加します。 –

+0

@ Khiem-KimHoXuan:おそらく新しい質問でそれを聞いてください。 – Giorgi

+0

@ Khiem-KimHoXuanリンクされた設定は何ですか?それはすべてのアセンブリをリンクしていますか? – Sreeraj

2

ジョルジの答えはあなたをシリアル化する方法についてのあなたの質問の最初の部分に答えますあなたは解決したようです。しかし、今度はそれをもう一度デシリアライズする問題があります。具体的には、このエラーについて多くを語る

Unable to find a constructor to use for type EventKit.EKEvent. @ A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute

あなたはそれが言うオープニングポストに供給しているあなたのスタックトレースを見てみます。さて、EventKit EKEvent API referenceを見て、私たちは次のことを見つける:

  1. すべてのコンストラクタがprotected
  2. 引数

DeserializeObject方法はしようとするとこれは、意味を取らない何のコンストラクタはありませんがマークされていますEKEventのインスタンスを作成しても、それを行う手段はありません。それはどのような引数を提供するのか分からない。

EKEventクラスには他にも問題があります。たとえそれが議論のない公共建設者を持っていたとしても。それに含まれるすべてのプロパティはread-onlyとマークされています。これは、シリアライザをデシリアライズするときに、シリアライズされたイベントでプロパティを設定する手段がないことを意味します。

ので、代わりにあなたはこれらの2つのオプションがあります。

  1. をクラスラッピングEKEventを作成するか、またはEKEventを模倣し、その
  2. EKEventsを永続化するために提供さEKEventStoreを使用することをデシリアライズします。 As the API docs describe: "EventStoreは、EventKitのすべての操作を実行する必要があり、すべてのEventKitデータの永続ストレージまたはデータベースエンジンと考えることができます。

オープニングポストでは、なぜこのオブジェクトをシリアル化してデシリアライズしたいのかについては説明していません。しかし、それをいくつかのAPIに伝えたいのであれば、プラットフォーム固有のものではなく、アプリケーションとAPIの間で関連するデータだけを通信して貴重な帯域幅を節約できるように、オプション1に進むことをお勧めします。

関連する問題