Ejemplo n.º 1
0
        /// <summary>
        /// Serialize header info into a memory stream and return as a byte array.
        /// This method must match the reading sequence in the
        /// <see cref="Open(System.IO.Stream,System.Func{string,System.Type})"/>.
        /// </summary>
        private ArraySegment <byte> CreateHeader()
        {
            var memStream = new MemoryStream();
            var memWriter = new BinaryWriter(memStream);

            //
            // Serialize header values
            //

            // Header size will be replaced by an actual length later
            memWriter.Write(FileSignature);
            memWriter.Write(0);
            memWriter.WriteVersion(BaseVersion);

            if (BaseVersion == Versions.Ver0 || BaseVersion == Versions.Ver1)
            {
                WriteHeaderV0(memWriter);
            }
            else if (BaseVersion == Versions.Ver2)
            {
                WriteHeaderV2(memWriter);
            }
            else
            {
                throw new IncompatibleVersionException(GetType(), BaseVersion);
            }

            IBinSerializer srlzr = NonGenericSerializer;

            if (srlzr.TypeSize <= 0)
            {
                throw new BinaryFileException(
                          "Serializer {0} reported incorrect type size {1} for type {2}",
                          srlzr.GetType().ToDebugStr(), srlzr.TypeSize,
                          srlzr.ItemType.ToDebugStr());
            }

            _enableMemMappedAccessOnRead  = false;
            _enableMemMappedAccessOnWrite = false;

            // Header size must be dividable by the item size
            var headerSize =
                (int)Utils.RoundUpToMultiple(memWriter.BaseStream.Position, srlzr.TypeSize);

            if (memStream.Capacity < headerSize)
            {
                memStream.Capacity = headerSize;
            }

            // Override the header size value at the 5th byte of the header.
            // The first 4 bytes are taken up by the 4 byte signature
            memWriter.Seek(sizeof(int), SeekOrigin.Begin);
            memWriter.Write(headerSize);

            HeaderSize = headerSize;

            return(new ArraySegment <byte>(memStream.GetBuffer(), 0, headerSize));
        }
Ejemplo n.º 2
0
 public static SerializerException GetItemSizeChangedException(
     [NotNull] IBinSerializer serializer, string tag, int itemSize)
 {
     if (serializer == null)
     {
         throw new ArgumentNullException("serializer");
     }
     return(new SerializerException(
                "Serializer {0} ({1}){2} was created with ItemSize={3}, but now the ItemSize={4}",
                serializer.GetType().ToDebugStr(),
                serializer.Version,
                tag == null ? "" : " Tag='" + tag + "'",
                itemSize,
                serializer.TypeSize));
 }
Ejemplo n.º 3
0
        public void InitNew(BinaryWriter writer)
        {
            ThrowOnInitialized();

            writer.WriteVersion(_version);

            writer.WriteType(_headerSerializer.GetType());
            _headerSerializer.InitNew(writer);

            writer.WriteType(_dataSerializer.GetType());
            _dataSerializer.InitNew(writer);

            writer.Write(ItemCount);

            _itemTypeSize = CalculateTypeSize();
            writer.Write(_itemTypeSize);

            IsInitialized = true;
        }