Esempio n. 1
0
        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]);
            }
        }
Esempio n. 2
0
 internal static long BeginWrite(IPrimitiveWriter writer, int version, int minVersion)
 {
     writer.WriteVarInt32(version);
     writer.WriteVarInt32(minVersion);
     writer.Write(-1);             // reserve
     return(writer.BaseStream.Position);
 }
Esempio n. 3
0
 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);
     }
 }
Esempio n. 4
0
 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);
     }
 }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
        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);
            }
        }
Esempio n. 7
0
 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);
     }
 }
Esempio n. 8
0
 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);
     }
 }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
 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);
     }
 }
Esempio n. 11
0
 internal static long BeginWrite(IPrimitiveWriter writer, int frameworkVersion)
 {
     writer.WriteVarInt32(frameworkVersion);
     writer.Write((byte)0);             // reserve
     return(writer.BaseStream.Position);
 }
Esempio n. 12
0
 internal static void WriteNull(IPrimitiveWriter writer)
 {
     writer.WriteVarInt32(-1);
 }