2012-03-13 15 views
1

我有以下對象設置:使用RestKit序列化一個對象與子對象[發佈] - 解決

RKObjectMapping* geoPointMapping = [RKObjectMapping mappingForClass:[CRGeoPoint class]]; 

geoPointMapping.setDefaultValueForMissingAttributes = YES; 
[geoPointMapping mapKeyPathsToAttributes: 
    @"longitude", @"longitude", 
    @"latitude", @"latitude", 
    nil]; 
[objectManager.mappingProvider registerMapping:geoPointMapping withRootKeyPath:@"geometry"]; 

RKObjectMapping* criteriaMapping = [RKObjectMapping mappingForClass:[CRCriteria class]]; 

criteriaMapping.setDefaultValueForMissingAttributes = YES; 
[criteriaMapping mapKeyPathsToAttributes: 
    @"type", @"type", 
    @"geometry", @"geometry", 
    @"fromDate", @"fromDate", 
    @"toDate", @"toDate", 
    @"radius", @"radius", 
    nil]; 
[objectManager.mappingProvider registerMapping:criteriaMapping withRootKeyPath:@"criteria"]; 

但是當我嘗試併發送查詢(用幾何對象)。我保留 得到此錯誤:

收到錯誤錯誤域= JKErrorDomain代碼= -1「無法序列化 對象類CRGeoPoint。」

--------- SOLUTION ----------

該解決方案是雙重的。首先,我必須指定下面指出的Sixten的逆映射,其次我必須指定用於CRCriteria對象上的CRGeoPoint類的映射。以下代碼:

RKObjectMapping* geoPointMapping = [RKObjectMapping mappingForClass:[CRGeoPoint class]]; 

    geoPointMapping.setDefaultValueForMissingAttributes = YES; 

    [objectManager.mappingProvider registerMapping:geoPointMapping withRootKeyPath:@"geometry"]; 

    // Build a serialization mapping by inverting our object mapping. Includes attributes and relationships 
    RKObjectMapping* geoPointSerializationMapping = [geoPointMapping inverseMapping]; 
    // You can customize the mapping here as necessary -- adding/removing mappings 
    [[RKObjectManager sharedManager].mappingProvider setSerializationMapping:geoPointSerializationMapping forClass:[CRGeoPoint class]]; 

    RKObjectMapping* criteriaMapping = [RKObjectMapping mappingForClass:[CRCriteria class]]; 

    criteriaMapping.setDefaultValueForMissingAttributes = YES; 
    [criteriaMapping mapKeyPathsToAttributes: 
    @"type", @"type", 
    @"fromDate", @"fromDate", 
    @"toDate", @"toDate", 
    @"radius", @"radius", 
    nil]; 
    [criteriaMapping mapKeyPath:@"geometry" toRelationship:@"geometry" withMapping:geoPointMapping]; 
    [objectManager.mappingProvider registerMapping:criteriaMapping withRootKeyPath:@"criteria"]; 

    // Build a serialization mapping by inverting our object mapping. Includes attributes and relationships 
    RKObjectMapping* criteriaSerializationMapping = [criteriaMapping inverseMapping]; 
    // You can customize the mapping here as necessary -- adding/removing mappings 
    [[RKObjectManager sharedManager].mappingProvider setSerializationMapping:criteriaSerializationMapping forClass:[CRCriteria class]]; 

回答

2

入站和出站映射信息由RKObjectMappingProvider單獨處理。您已經在該代碼中配置了入站映射(從您的服務器下載數據)。但是 - RestKit組上的as pointed out by Shane Zatezalo - 您還需要添加RestKit的序列化映射,以瞭解如何將對象轉換爲JSON(或任何其他可能使用的序列化格式)。

查看有關對象序列化的Object Mapping tutorial's部分。看看source for the mapping provider,以確保你自己這些東西是分開的。

+0

感謝指向文檔的指針,您和Shane都部分正確。但該文件指出了完整答案的方式。我不僅需要創建逆映射,還需要指定要用於關係的映射。 – 2012-03-14 20:16:35

+0

是的,我很困惑這一段時間。最終我意識到我需要用映射提供程序註冊映射(由資源路徑控制),並分別向路由器註冊類資源路徑。 – drewish 2012-07-23 13:22:24