MemoryData Serialize(const SirenObject& obj, const ISirenType& type, SirenCoderType coder/*=SirenCoderType::Compact*/) { switch (coder) { case SirenCoderType::Compact: { MemoryStream stream; SirenCompactBinaryWriter writer(stream); SirenObjectSerializer serializer(writer); if (serializer.Serialize(obj, type)) { return stream.CurrentBuffer(); } return MemoryData::Empty; } case SirenCoderType::Fast: { MemoryStream stream; SirenFastBinaryWriter writer(stream); SirenObjectSerializer serializer(writer); if (serializer.Serialize(obj, type)) { return stream.CurrentBuffer(); } return MemoryData::Empty; } case SirenCoderType::Json: { MemoryStream stream; SirenJsonWriter writer(stream); SirenObjectSerializer serializer(writer); if (serializer.Serialize(obj, type)) { return stream.CurrentBuffer(); } return MemoryData::Empty; } #ifdef MEDUSA_SQL case SirenCoderType::SqlText: { MemoryStream stream; SirenSqlTextWriter writer(stream); SirenObjectSerializer serializer(writer); if (serializer.Serialize(obj, type)) { return stream.CurrentBuffer(); } return MemoryData::Empty; } #endif } return MemoryData::Empty; }
const IStream* FileStorage::ReadFileHelper(const FileEntry& file, FileDataType dataType /*= FileDataType::Binary*/) const { const IStream* resultStream = OnReadFile(file, dataType); RETURN_NULL_IF_NULL(resultStream); const CoderChain* coderChain = GetFileCoderChain(file); if (coderChain != nullptr) { if (IsWholeFileCoding()) { MemoryStream* tempStream = new MemoryStream(file.OriginalSize(), false); coderChain->Decode(*resultStream, *tempStream); const auto data = tempStream->CurrentBuffer(); SAFE_DELETE(tempStream); MemoryStream* outputStream = new MemoryStream(data); resultStream = outputStream; } else { resultStream = new BlockCodeReadStream(*resultStream, BlockSize(), *coderChain, file); } } return resultStream; }