private void WriteMetadataDocument(byte[] initializationVector)
        {
            MetadataDocument metadataDocument = new MetadataDocument();

            metadataDocument.InitializationVector = initializationVector;
            MetadataDocument obj = metadataDocument;

            byte[] document = BinarySerializer.Serialize(obj, typeof(MetadataDocument));
            metadataDocumentId = ((metadataDocumentId == 0) ? packedFile.Insert(document) : packedFile.Update(metadataDocumentId, document));
        }
 public DocumentCollection(PackedFile packedFile, IndexFactory indexFactory, byte[] key, JournalPlayer journalPlayer, JournalWriter journalWriter)
 {
     transactionLockObject = new object();
     EnsureValidKey(key);
     documentType = typeof(TDocument);
     try
     {
         journalPlayer.Play();
         SerializerReflectionCache.AddTypes(typeof(MetadataDocument), documentType);
         this.packedFile    = packedFile;
         this.journalPlayer = journalPlayer;
         this.journalWriter = journalWriter;
         byte[] initializationVector;
         if (packedFile.IsEmpty)
         {
             initializationVector = CryptoRandomNumberGenerator.GenerateBytes(16u);
             journalWriter.Start();
             WriteMetadataDocument(initializationVector);
             journalWriter.Finish();
             journalPlayer.Play();
         }
         else
         {
             KeyValuePair <uint, byte[]> keyValuePair = packedFile.Documents.First();
             metadataDocumentId = keyValuePair.Key;
             MetadataDocument metadataDocument = BinarySerializer.Deserialize <MetadataDocument>(keyValuePair.Value);
             initializationVector = metadataDocument.InitializationVector;
         }
         encryptor    = new Aes256Encryptor(key, initializationVector);
         fieldIndexes = new FieldIndexes <TDocument>(indexFactory, encryptor);
     }
     catch (Exception)
     {
         journalWriter.Discard();
         throw;
     }
 }