// Serialization public void Serialize(Int64 valueToSerialize) { // Is it default value if (valueToSerialize == 0) { SerializerStorage.WriteStorageFormat(new DefaultValue()); return; } // Should we store value in main data stream? if (valueToSerialize > 0 && valueToSerialize <= ValueInConfig.MaxValueToStoreInConfig) { // We can store value in config SerializerStorage.WriteStorageFormat(new ValueInConfig(valueToSerialize)); } else { byte[] packedData = BitToolkit.ConvertInt64ToByteArray(valueToSerialize); SerializerStorage.WriteStorageFormat(new ValueInDataStream((byte)packedData.Length)); SerializerStorage.WritePackedData(packedData); } }
// Serialization of internal data to byte array (Final step of serialization) public byte[] ToByteArray() { int StorageFormatIds_ByteArraySize = StorageFormatIds.GetByteArraySize(); int StorageFormatData_ByteArraySize = StorageFormatData.GetByteArraySize(); int PackedData_ByteArraySize = PackedData.ByteArraySize; byte[] storageFormatIdsSizeBytes = BitToolkit.EncodeSize(StorageFormatIds_ByteArraySize); byte[] storageFormatDataSizeBytes = BitToolkit.EncodeSize(StorageFormatData_ByteArraySize); byte[] packedDataSizeBytes = BitToolkit.EncodeSize(PackedData_ByteArraySize); // Storage estimated size int estimatedSize = StorageFormatIds_ByteArraySize + StorageFormatData_ByteArraySize + PackedData_ByteArraySize; // Serializer configuration SerializerConfiguration serConfig = new SerializerConfiguration(); serConfig.SerializerFormatVersion = m_SerializerFormatVersion; // Compress if we have necessary data already if (ActiveCompressionType != CompressionType.NoCompression && estimatedSize > CompressionThreshold) { serConfig.CompressionType = ActiveCompressionType; } // Should we compress data? if (serConfig.IsCompressed) { byte[] rawDataAggregated = new byte[storageFormatIdsSizeBytes.Length + storageFormatDataSizeBytes.Length + packedDataSizeBytes.Length + StorageFormatIds_ByteArraySize + StorageFormatData_ByteArraySize + PackedData_ByteArraySize]; int destIndex = 0; // Store StorageFormatIds bytes byte[] tmpArray = storageFormatIdsSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; StorageFormatIds.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += StorageFormatIds_ByteArraySize; // Store StorageFormatData bytes tmpArray = storageFormatDataSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; StorageFormatData.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += StorageFormatData_ByteArraySize; // Store PackedData bytes tmpArray = packedDataSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; PackedData.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += PackedData_ByteArraySize; // Compressed result byte[] compressedContent = CompressionFactory.GetCompressionEngine(ActiveCompressionType).Compress(rawDataAggregated, ActiveCompressionLevel); // Encode config byte[] serConfigBytes = serConfig.ToByteArray(); // Buffer for final result byte[] result = new byte[serConfigBytes.Length + compressedContent.Length]; // Copy config info Array.Copy(serConfigBytes, 0, result, 0, serConfigBytes.Length); // Copy compressed content Array.Copy(compressedContent, 0, result, serConfigBytes.Length, compressedContent.Length); return(result); } else { // No compression necessary - we store raw data // Encode config byte[] serConfigBytes = serConfig.ToByteArray(); byte[] rawDataAggregated = new byte[serConfigBytes.Length + storageFormatIdsSizeBytes.Length + storageFormatDataSizeBytes.Length + packedDataSizeBytes.Length + StorageFormatIds_ByteArraySize + StorageFormatData_ByteArraySize + PackedData_ByteArraySize]; int destIndex = 0; // Store Serialization Configuration bytes byte[] tmpArray = serConfigBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; // Store StorageFormatIds bytes tmpArray = storageFormatIdsSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; StorageFormatIds.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += StorageFormatIds_ByteArraySize; // Store StorageFormatData bytes tmpArray = storageFormatDataSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; StorageFormatData.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += StorageFormatData_ByteArraySize; // Store PackedData bytes tmpArray = packedDataSizeBytes; Array.Copy(tmpArray, 0, rawDataAggregated, destIndex, tmpArray.Length); destIndex += tmpArray.Length; PackedData.StoreBytesInByteArray(rawDataAggregated, destIndex); destIndex += PackedData_ByteArraySize; return(rawDataAggregated); } }