1

オブジェクトにそれ自体の他のインスタンスが含まれている可能性があるオブジェクトに対してシリアライゼーションを機能させるのに苦労しています。

たとえば、オブジェクト: Person NSString* name Person* Mother この JSON は次のようになります: {

"person": [

           {

            "name": "Blake Watters",

            "mother": {

                "name": "Jane Doe",

                "mother": {

                    "name":"Jane Smith",

                    "age":65

                }

            }

           }

        ]

}

マッピングを作成します: RKObjectMapping* personMapping = [RKObjectMapping mappingForClass:[Person クラス] ];

[personMapping mapAttributes:@"name", nil];

[personMapping mapKeyPath:@"mother" 
           toRelationship:@"mother" 
              withMapping:personMapping];

オブジェクトをシリアル化できるようにこれに対して逆マッピングを実行すると、マッピングが継続的に追加されるため、再帰マッピング エラーが発生します。

私が見つけた唯一の答えは、関係に「serialization:NO」を設定することです。これにより、反転してからシリアル化できますが、シリアル化にはもちろん、マザー オブジェクトがありません。

これを回避する方法はありますか?このシリアライゼーションを逆にした後、オブジェクトに手動で追加できますか?

編集:

次のコードが機能しているように見えるので、後でそれを追加し直すことがこれを達成する方法かもしれません。もっと良い方法があるに違いないと感じますが。

// Map name
RKObjectMapping* nameMapping = [RKObjectMapping mappingForClass:[Name class]];
[nameMapping mapAttributes:@"first",@"last", nil];

// Map person
RKObjectMapping* personMapping = [RKObjectMapping mappingForClass:[Person class] ];
[personMapping mapAttributes:@"age", nil];
[personMapping mapKeyPath:@"name" toRelationship:@"name" withMapping:nameMapping];

// Don't serialize mother
[personMapping mapKeyPath:@"mother" toRelationship:@"mother" withMapping:personMapping serialize:NO];

// Connect our mapping to RestKit's mapping provider
[[RKObjectManager sharedManager].mappingProvider setMapping:personMapping forKeyPath:@"person"];

// invert the mapping
RKObjectMapping* personSerialization = [personMapping inverseMapping];
RKObjectMapping* mapping = [[RKObjectManager sharedManager].mappingProvider 
                            serializationMappingForClass:[Person class]];
// Since mother wasn't serialized, add its relationship back in
[personSerialization mapKeyPath:@"mother" 
                 toRelationship:@"mother" 
                    withMapping:personSerialization];    
[[RKObjectManager sharedManager].mappingProvider setSerializationMapping:personSerialization 
                                                                forClass:[Person class]];

ありがとう、アダム

4

0 に答える 0