public void WriteTo(IPrimitiveWriter writer) { if (_types.Count == 0) { writer.WriteVarInt32(0); return; } int nextAssemblyId = 0; var orderedAssemblyNames = new List <string>(); var indexedAssemblyNames = new Dictionary <string, int>(); var typesToWrite = new string [_types.Count]; var assemblyReferencesToWrite = new int [_types.Count]; for (int i = 0; i < _types.Count; ++i) { int id; if (!indexedAssemblyNames.TryGetValue(_types[i].AssemblyName, out id)) { id = nextAssemblyId++; orderedAssemblyNames.Add(_types[i].AssemblyName); indexedAssemblyNames.Add(_types[i].AssemblyName, id); } typesToWrite[i] = _types[i].FullTypeName; assemblyReferencesToWrite[i] = id; } WriteSegments(writer, orderedAssemblyNames, '.'); WriteSegments(writer, typesToWrite, '.'); for (int i = 0; i < assemblyReferencesToWrite.Length; ++i) { writer.WriteVarInt32(assemblyReferencesToWrite[i]); } }
internal static long BeginWrite(IPrimitiveWriter writer, int version, int minVersion) { writer.WriteVarInt32(version); writer.WriteVarInt32(minVersion); writer.Write(-1); // reserve return(writer.BaseStream.Position); }
public static void WriteByteArray(this IPrimitiveWriter writer, byte[] value) { if (value == null) { writer.WriteVarInt32(-1); } else { writer.WriteVarInt32(value.Length); writer.BaseStream.Write(value, 0, value.Length); } }
public static void WriteCustomSerializable <T>(T part, IPrimitiveWriter writer) where T : ICustomSerializable { if (part == null) { writer.WriteVarInt32(-1); } else { writer.WriteVarInt32(0); part.Serialize(writer); } }
public static void WriteIPAddress(this IPrimitiveWriter writer, IPAddress value) { if (value == null) { writer.WriteVarInt32(-1); } else { var buffer = value.GetAddressBytes(); writer.WriteVarInt32(buffer.Length); writer.BaseStream.Write(buffer, 0, buffer.Length); } }
private static void WriteSegments( IPrimitiveWriter writer, IEnumerable <string> items, char segmentDelimiter) { int nextSegmentId = 1; var itemReferences = new List <byte[]>(); var idsBySegment = new Dictionary <string, int>(); var orderedSegments = new List <string>(); var splitter = new [] { segmentDelimiter }; var stream = new MemoryStream(); foreach (var item in items) { var segments = item.Split(splitter, StringSplitOptions.None); for (int i = 0; i < segments.Length; ++i) { int id; if (!idsBySegment.TryGetValue(segments[i], out id)) { id = nextSegmentId++; idsBySegment.Add(segments[i], id); orderedSegments.Add(segments[i]); } if (i < segments.Length - 1) { stream.WriteVarInt32(id); } else { // the last one is negative so we know when to stop stream.WriteVarInt32(-id); } } itemReferences.Add(stream.ToArray()); stream.SetLength(0); } writer.WriteVarInt32(orderedSegments.Count); for (int i = 0; i < orderedSegments.Count; ++i) { WriteString(writer, orderedSegments[i]); } writer.WriteVarInt32(itemReferences.Count); for (int i = 0; i < itemReferences.Count; ++i) { writer.BaseStream.Write(itemReferences[i], 0, itemReferences[i].Length); } }
public static void WriteBitArray(this IPrimitiveWriter writer, BitArray value) { if (value == null) { writer.WriteVarInt32(-1); } else { writer.WriteVarInt32(value.Count); var buffer = new byte[RoundToNearest8(value.Count)]; value.CopyTo(buffer, 0); writer.BaseStream.Write(buffer, 0, buffer.Length); } }
private static void WriteString(IPrimitiveWriter writer, string value) { if (value == null) { writer.WriteVarInt32(-1); } else if (value.Length == 0) { writer.WriteVarInt32(0); } else { var bytes = _encoding.GetBytes(value); writer.WriteVarInt32(bytes.Length); writer.BaseStream.Write(bytes, 0, bytes.Length); } }
public static void WriteVersionSerializable <T>(T part, IPrimitiveWriter writer) where T : IVersionSerializable { if (part == null) { writer.WriteVarInt32(-1); return; } var currentVersion = part.CurrentVersion; if (currentVersion < 0) { throw new InvalidOperationException(string.Format("IVersionSerializable.CurrentVersion of Type=\"{0}\" returned a value of {1} but values are not allowed to be negative.", part.GetType(), currentVersion)); } writer.WriteVarInt32(currentVersion); part.Serialize(writer); }
public static void WriteIPEndPoint(this IPrimitiveWriter writer, IPEndPoint value) { if (value == null) { writer.Write(false); } else { writer.Write(true); WriteIPAddress(writer, value.Address); writer.WriteVarInt32(value.Port); } }
internal static long BeginWrite(IPrimitiveWriter writer, int frameworkVersion) { writer.WriteVarInt32(frameworkVersion); writer.Write((byte)0); // reserve return(writer.BaseStream.Position); }
internal static void WriteNull(IPrimitiveWriter writer) { writer.WriteVarInt32(-1); }