1

Java / Android関数は次のとおりです。

public static byte[] serialize(MyClass myObject) {

    int byteArraySizeNeeded = getByteArraySizeNeededForSerialize(myObject);

    byte[] result = new byte[byteArraySizeNeeded];
    ByteBuffer bb = ByteBuffer.wrap(result);
    bb.putShort((short) (byteArraySizeNeeded-2));// 2 - not need to read at deserialisation!

    bb.putLong(myObject.getProperty1ValueWhichIsALong());// 8
    bb.putDouble(myObject.getProperty2ValueWhichIsADouble());// 8
    bb.putFloat(myObject.getProperty3ValueWhichIsAFloat);//4
    bb.put(CODE_MYCODE1); // code
    bb.putFloat(myObject.getProperty4ValueWhichIsAFloat);

// there are a lot of properties and the list is dynamic: some need to be saved some not: eg if property 10 exists than not needed to save property 11 and property 25 is saved only if not null and so on.

    int curPosition = bb.position();
    int offset = 2; // skip the first 2 bytes representing the size of byte buffer needed to allocate.
    int byteCount = curPosition - offset;

    myObject.crc.update(result, offset, byteCount);
    long crcValue = myObject.crc.getValue();

    bb.put(CODE_CRC); // code
    bb.putLong(crcValue);// only distinct data values

    return result;
}

iOSでもやりたいです。または、使用する低レベルのデータ構造/クラスが見つからないか、見つかりません。

NSDataNSMutableDataは、バイト配列をラップするオブジェクトであると主張していますが、それらが有用に機能するのはdataContentsOfFilewriteToFileだけです。

NSArchiverは ObjectOutputStream のようなものです。

アーカイブとシリアライゼーション プログラミング ガイド encodeBytes:length:forKey のようなキーを配置する必要のないメソッドが見つかりません:

車輪を再発明したり、保存時に不要なデータを大量に使用したりしたくありません。

putLong() putFloat() putInt() を持ち、char または byte 配列を適切に作成するユーティリティ クラスはありますか?

4

1 に答える 1

1

同じ質問を見つけました。この回答はそれに基づいています。NSOutputStreamを使用して、ByteBuffer と同じインターフェイスを実装するクラスを簡単に作成できます。このようなもの:

- (NSOutputStream*)outputStream {
    if (_outputStream == nil) {
        _outputStream = [[NSOutputStream alloc] initToMemory];
        [_outputStream open];
    }
    return _outputStream;
}

- (void)putInt:(NSInteger)value {
    [self.outputStream write:(uint8_t*)&value maxLength:sizeof(NSInteger)];
}

- (NSData*)data {
    return [self.outputStream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
}
于 2013-09-06T13:20:47.400 に答える