static void Main() { var file = @"c:\temp\test.bin"; IEnumerable <Yours> t = new Yours[3]; File.WriteAllBytes(file, ByteSerializer.SerializeMessage(t)); using (var stream = File.OpenRead(file)) { Console.WriteLine("file size: " + stream.Length); } }
/// <summary>Read the given number of bytes from the stream and deserialze it into the instance.</summary> public static Yours.Nullables.MyMessageV2 DeserializeLength(Stream stream, int length, Yours.Nullables.MyMessageV2 instance) { var br = new BinaryReader(stream); instance.FieldA = -1; instance.FieldB = 4.5; instance.FieldC = 5.4f; instance.FieldD = -2; instance.FieldE = -3; instance.FieldF = 4; instance.FieldG = 5; instance.FieldH = -6; instance.FieldI = -7; instance.FieldJ = 8; instance.FieldK = 9; instance.FieldL = -10; instance.FieldM = -11; instance.FieldN = false; instance.FieldO = "test"; instance.FieldR = Yours.Nullables.MyMessageV2.MyEnum.ETest2; #pragma warning disable 612 #pragma warning restore 612 if (instance.FieldT == null) instance.FieldT = new List<uint>(); if (instance.FieldS == null) instance.FieldS = new List<uint>(); if (instance.FieldV == null) instance.FieldV = new List<Theirs.Nullables.TheirMessage>(); long limit = stream.Position + length; while (true) { if (stream.Position >= limit) { if (stream.Position == limit) break; else throw new global::SilentOrbit.ProtocolBuffers.ProtocolBufferException("Read past max limit"); } int keyByte = stream.ReadByte(); if (keyByte == -1) throw new System.IO.EndOfStreamException(); // Optimized reading of known fields with field ID < 16 switch (keyByte) { // Field 1 Varint case 8: instance.FieldA = (int)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 2 Fixed64 case 17: instance.FieldB = br.ReadDouble(); continue; // Field 3 Fixed32 case 29: instance.FieldC = br.ReadSingle(); continue; // Field 4 Varint case 32: instance.FieldD = (int)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 5 Varint case 40: instance.FieldE = (long)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 6 Varint case 48: instance.FieldF = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream); continue; // Field 7 Varint case 56: instance.FieldG = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 8 Varint case 64: instance.FieldH = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadZInt32(stream); continue; // Field 9 Varint case 72: instance.FieldI = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadZInt64(stream); continue; // Field 10 Fixed32 case 85: instance.FieldJ = br.ReadUInt32(); continue; // Field 11 Fixed64 case 89: instance.FieldK = br.ReadUInt64(); continue; // Field 12 Fixed32 case 101: instance.FieldL = br.ReadInt32(); continue; // Field 13 Fixed64 case 105: instance.FieldM = br.ReadInt64(); continue; // Field 14 Varint case 112: instance.FieldN = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadBool(stream); continue; // Field 15 LengthDelimited case 122: instance.FieldO = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadString(stream); continue; } var key = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadKey((byte)keyByte, stream); // Reading field ID > 16 and unknown field ID/wire type combinations switch (key.Field) { case 0: throw new global::SilentOrbit.ProtocolBuffers.ProtocolBufferException("Invalid field id: 0, something went wrong in the stream"); case 16: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; instance.FieldP = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadBytes(stream); continue; case 17: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.FieldQ = (Yours.Nullables.MyMessageV2.MyEnum)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; case 18: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.FieldR = (Yours.Nullables.MyMessageV2.MyEnum)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; case 19: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; #pragma warning disable 612 instance.Dummy = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadString(stream); continue; #pragma warning restore 612 case 20: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; // repeated packed long end20 = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream); end20 += stream.Position; while (stream.Position < end20) { instance.FieldT.Add(br.ReadUInt32()); } if (stream.Position != end20) throw new global::SilentOrbit.ProtocolBuffers.ProtocolBufferException("Read too many bytes in packed data"); continue; case 21: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; // repeated instance.FieldS.Add(global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream)); continue; case 22: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; if (instance.FieldU == null) instance.FieldU = Theirs.Nullables.TheirMessage.DeserializeLengthDelimited(stream); else Theirs.Nullables.TheirMessage.DeserializeLengthDelimited(stream, instance.FieldU); continue; case 23: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; // repeated instance.FieldV.Add(Theirs.Nullables.TheirMessage.DeserializeLengthDelimited(stream)); continue; case 24: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.NullableInt = (int)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; case 25: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.NullableEnum = (Yours.Nullables.MyMessageV2.AliasedEnum)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; default: global::SilentOrbit.ProtocolBuffers.ProtocolParser.SkipKey(stream, key); break; } } return instance; }
/// <summary>Helper: put the buffer into a MemoryStream before deserializing</summary> public static Yours.Nullables.MyMessageV2 Deserialize(byte[] buffer, Yours.Nullables.MyMessageV2 instance) { using (var ms = new MemoryStream(buffer)) Deserialize(ms, instance); return instance; }
/// <summary>Read the VarInt length prefix and the given number of bytes from the stream and deserialze it into the instance.</summary> public static Yours.MyMessageV2 DeserializeLengthDelimited(Stream stream, Yours.MyMessageV2 instance) { BinaryReader br = new BinaryReader(stream); instance.FieldR = Yours.MyMessageV2.MyEnum.ETest2; if (instance.FieldT == null) instance.FieldT = new List<uint>(); if (instance.FieldS == null) instance.FieldS = new List<uint>(); if (instance.FieldV == null) instance.FieldV = new List<Theirs.TheirMessage>(); long limit = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream); limit += stream.Position; while (true) { if (stream.Position >= limit) { if (stream.Position == limit) break; else throw new InvalidOperationException("Read past max limit"); } int keyByte = stream.ReadByte(); if (keyByte == -1) throw new System.IO.EndOfStreamException(); // Optimized reading of known fields with field ID < 16 switch (keyByte) { // Field 1 Varint case 8: instance.FieldA = (int)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 2 Fixed64 case 17: instance.FieldB = br.ReadDouble(); continue; // Field 3 Fixed32 case 29: instance.FieldC = br.ReadSingle(); continue; // Field 4 Varint case 32: instance.FieldD = (int)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 5 Varint case 40: instance.FieldE = (long)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 6 Varint case 48: instance.FieldF = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream); continue; // Field 7 Varint case 56: instance.FieldG = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; // Field 8 Varint case 64: instance.FieldH = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadZInt32(stream); continue; // Field 9 Varint case 72: instance.FieldI = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadZInt64(stream); continue; // Field 10 Fixed32 case 85: instance.FieldJ = br.ReadUInt32(); continue; // Field 11 Fixed64 case 89: instance.FieldK = br.ReadUInt64(); continue; // Field 12 Fixed32 case 101: instance.FieldL = br.ReadInt32(); continue; // Field 13 Fixed64 case 105: instance.FieldM = br.ReadInt64(); continue; // Field 14 Varint case 112: instance.FieldN = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadBool(stream); continue; // Field 15 LengthDelimited case 122: instance.FieldO = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadString(stream); continue; } var key = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadKey((byte)keyByte, stream); // Reading field ID > 16 and unknown field ID/wire type combinations switch (key.Field) { case 0: throw new InvalidDataException("Invalid field id: 0, something went wrong in the stream"); case 16: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; instance.FieldP = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadBytes(stream); continue; case 17: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.FieldQ = (Yours.MyMessageV2.MyEnum)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; case 18: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; instance.FieldR = (Yours.MyMessageV2.MyEnum)global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt64(stream); continue; case 19: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; instance.Dummy = global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadString(stream); continue; case 20: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; // repeated packed using (var ms20 = new MemoryStream(global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadBytes(stream))) { BinaryReader br20 = new BinaryReader(ms20); while (ms20.Position < ms20.Length) { instance.FieldT.Add(br20.ReadUInt32()); } } continue; case 21: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.Varint) break; // repeated instance.FieldS.Add(global::SilentOrbit.ProtocolBuffers.ProtocolParser.ReadUInt32(stream)); continue; case 22: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; if (instance.FieldU == null) instance.FieldU = Theirs.TheirMessage.DeserializeLengthDelimited(stream); else Theirs.TheirMessage.DeserializeLengthDelimited(stream, instance.FieldU); continue; case 23: if(key.WireType != global::SilentOrbit.ProtocolBuffers.Wire.LengthDelimited) break; // repeated instance.FieldV.Add(Theirs.TheirMessage.DeserializeLengthDelimited(stream)); continue; default: global::SilentOrbit.ProtocolBuffers.ProtocolParser.SkipKey(stream, key); break; } } return instance; }