public override int Serialize(ref byte[] bytes, int offset, IReadOnlyDictionary <TKey, TValue> value) { if (value == null) { BinaryUtil.WriteInt32(ref bytes, offset, -1); return(4); } var startOffset = offset; offset += BinaryUtil.WriteInt32(ref bytes, offset, value.Count); foreach (var item in value) // Dictionary.Enumerator is faster than from interfaces... { offset += formatter.Serialize(ref bytes, offset, item); } return(offset - startOffset); }
public override int Serialize(ref byte[] bytes, int offset, IDictionary <TKey, TValue> value) { if (value == null) { BinaryUtil.WriteInt32(ref bytes, offset, -1); return(4); } var startOffset = offset; offset += BinaryUtil.WriteInt32(ref bytes, offset, value.Count); foreach (var item in value) { offset += formatter.Serialize(ref bytes, offset, item); } return(offset - startOffset); }
public override int Serialize(ref byte[] bytes, int offset, ILookup <TKey, TElement> value) { var startOffset = offset; if (value == null) { BinaryUtil.WriteInt32(ref bytes, offset, -1); return(4); } offset += ZeroFormatter.Internal.BinaryUtil.WriteInt32(ref bytes, offset, value.Count); foreach (var item in value) { offset += keyFormatter.Serialize(ref bytes, offset, item.Key); offset += valuesFormatter.Serialize(ref bytes, offset, item); } return(offset - startOffset); }
public override int Serialize(ref byte[] bytes, int offset, T?value) { var len = GetLength(); if (len != null) { BinaryUtil.EnsureCapacity(ref bytes, offset, len.Value); } BinaryUtil.WriteBoolean(ref bytes, offset, value.HasValue); if (value.HasValue) { var startOffset = offset; offset += 1; offset += innerFormatter.Serialize(ref bytes, offset, value.Value); return(offset - startOffset); } else { return(1); } }
public override int Serialize(ref byte[] bytes, int offset, IEnumerable <T> value) { if (value == null) { BinaryUtil.WriteInt32(ref bytes, offset, -1); return(4); } var startOffset = offset; offset += 4; var count = 0; foreach (var item in value) { offset += formatter.Serialize(ref bytes, offset, item); count++; } BinaryUtil.WriteInt32(ref bytes, startOffset, count); return(offset - startOffset); }
public override int Serialize(ref byte[] bytes, int offset, IList <T> value) { if (value == null) { BinaryUtil.WriteInt32(ref bytes, offset, -1); return(4); } var segment = value as IZeroFormatterSegment; if (segment != null) { return(segment.Serialize(ref bytes, offset)); } var length = formatter.GetLength(); if (length != null) { // FixedSize Array var writeSize = value.Count * length.Value + 4; if (bytes == null) { bytes = new byte[writeSize]; } offset += BinaryUtil.WriteInt32(ref bytes, offset, value.Count); // Optimize iteration var array = value as T[]; if (array != null) { for (int i = 0; i < array.Length; i++) { offset += formatter.Serialize(ref bytes, offset, array[i]); } } else { var list = value as List <T>; if (list != null) { for (int i = 0; i < list.Count; i++) { offset += formatter.Serialize(ref bytes, offset, list[i]); } } else { foreach (var item in value) { offset += formatter.Serialize(ref bytes, offset, item); } } } return(writeSize); } else { var startoffset = offset; var indexStartOffset = startoffset + 8; offset = (startoffset + 8) + (value.Count * 4); // Optimize iteration var array = value as T[]; if (array != null) { for (int i = 0; i < array.Length; i++) { var size = formatter.Serialize(ref bytes, offset, array[i]); BinaryUtil.WriteInt32Unsafe(ref bytes, indexStartOffset + i * 4, offset - startoffset); offset += size; } } else { var list = value as List <T>; if (list != null) { for (int i = 0; i < list.Count; i++) { var size = formatter.Serialize(ref bytes, offset, list[i]); BinaryUtil.WriteInt32Unsafe(ref bytes, indexStartOffset + i * 4, offset - startoffset); offset += size; } } else { var count = 0; foreach (var item in value) { var size = formatter.Serialize(ref bytes, offset, item); BinaryUtil.WriteInt32Unsafe(ref bytes, indexStartOffset + count * 4, offset - startoffset); offset += size; count++; } } } BinaryUtil.WriteInt32(ref bytes, startoffset + 4, value.Count); var totalBytes = offset - startoffset; BinaryUtil.WriteInt32Unsafe(ref bytes, startoffset, totalBytes); return(totalBytes); } }