1

ローカルおよびデータベースに保存する必要がある大量の変数を含むオブジェクトがあります。このオブジェクトは、NSKeyedArchiver ( https://github.com/nicklockwood/CryptoCodingの CryptoCoder と組み合わせて) を使用してシリアル化され、ローカルに保存されます。

今、データをデータベース (cloudant.com) に保存しようとしています。NSData を直接使用してデータを送信し、(例: < F60323 04A525 ... ... 6D3301>) をデータベースに保存することはできますが、それを読み返すと、それを NSData に変換する方法がわかりません。エンコーディングで NSString を使用すると、null の結果が生成されます。

シリアライズされたデータはplist形式のファイルに書かれているので、NSPropertyListSerializationを使ってNSDictionaryに変換して送信してみましたが、変換がうまくいきませんでした。

アドバイスが必要です。

4

1 に答える 1

1

NSData(たとえば、<F60323 04A525 ... ... 6D3301>)は16進形式です。[NSData description]その結果を得るためにメソッドを呼び出していると思います。シリアル化は不可能ではありませんが、シリアル化に使用することは想定されていません。(カスタムの16進数からデータへのコンバーターを作成する必要があります)

ネット経由でデータを転送する方法はたくさんあります。トランスポート層にHTTPを使用していると想定しています。これを行う方法を2つ挙げます

JSONの方法(より多くのデータ型をサポートしますが、plistでも機能します)

シリアル化するオブジェクトを、NSJSONSerializerがJSONに正常にシリアル化できるオブジェクトに変換するカスタムシリアライザーとデシリアライザーを記述します。

JSONに変換できるオブジェクトには、次のプロパティが必要です。

  • 最上位オブジェクトはNSArrayまたはNSDictionaryです。
  • すべてのオブジェクトは、NSString、NSNumber、NSArray、NSDictionary、またはNSNullのインスタンスです。
  • すべての辞書キーはNSStringのインスタンスです。
  • 数値はNaNまたは無限大ではありません。

参照:

HTTPを介した生のNSData

HTTPを介した(NSCodingからの)生のNSDataのアップロードは、通常、application/octet-streamのHTTPPOSTまたはmultipart/form-dataのいずれかを使用して行われます。

application / x-www-form-urlencodedなどの他の方法でPOSTする場合は、base64や16進数などのWeb対応エンコーディングにシリアル化する必要があります。Base64の使用をお勧めします。iOSにはBase64エンコーダーとデコーダーが付属していませんが、私はそれを作成しました(Matt ThompsonのAFNetworking実装に基づく)。他の人が私がレビューした同様のメソッドを書いたことを知っています。マットトンプソン(およびその後に派生したbase64デコーダーコード)はクリーンで読みやすく、ロジックが可能な限り少ないことがわかりました。

Objective-CでのBase64エンコーディングとデコーディングの実装

サーバーからデータを取得するときは、データが(base64またはhex)エンコードされている場合は、最初にデコードしてください。実装に応じて、デコードされたデータをJSON、プロパティリスト、またはNSCodingにシリアル化します。

基本的に、シリアル化の手順を逆にします。

于 2013-03-18T17:58:02.110 に答える