2013-09-06 5 views
1

Вот Java/Android функция:Ios низкого уровня сериализации

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; 
} 

Я хотел бы сделать на прошивке тоже. Или я пропускаю или не могу найти структуру/класс данных низкого уровня, что использовать.

NSData и NSMutableData утверждают, что объект, который оборачивает массив байтов, но они с пользой функционировать лишь dataContentsOfFile и writeToFile.

NSArchiver как объект ObjectOutputStream.

Archives and Serializations Programming Guide Не удается найти какой-либо метод, который не требуется, чтобы положить ключ как encodeBytes: длина: forKey:

Я не хочу, чтобы изобретать колесо, а также использовать много ненужных данных при сохранении.

Является ли какой-либо класс утилиты, который имеет putLong() putFloat() putInt() и правильно создает массив символов или байтов?

+0

Хммм, вы пытаетесь использовать NSCache? [NSCache пример] [1] [1]: http://stackoverflow.com/questions/12817476/how-to-store-data-in-nscache-in-ios –

+0

@ daro2189 немного хуже, чем NSMutableDictionary –

ответ

1

Я нашел the same question, и этот ответ основан на нем. Вы можете легко создать класс, который реализует тот же интерфейс, что и ByteBuffer, с помощью NSOutputStream. Что-то вроде этого:

- (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]; 
} 
+0

+1 Благодарю вас, я проверю в офисе код и, вероятно, он будет принят и ответ –

Смежные вопросы