/// <summary> /// Writes a decimal to a protobuf stream /// </summary> public static void WriteDecimal(decimal value, ProtoWriter writer) { int[] bits = decimal.GetBits(value); ulong a = ((ulong)bits[1]) << 32, b = ((ulong)bits[0]) & 0xFFFFFFFFL; ulong low = a | b; uint high = (uint)bits[2]; uint signScale = (uint)(((bits[3] >> 15) & 0x01FE) | ((bits[3] >> 31) & 0x0001)); SubItemToken token = ProtoWriter.StartSubItemWithoutWritingHeader(null, writer); if (low != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalLow, WireType.Variant, writer); ProtoWriter.WriteUInt64(low, writer); } if (high != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalHigh, WireType.Variant, writer); ProtoWriter.WriteUInt32(high, writer); } if (signScale != 0) { ProtoWriter.WriteFieldHeader(FieldDecimalSignScale, WireType.Variant, writer); ProtoWriter.WriteUInt32(signScale, writer); } ProtoWriter.EndSubItem(token, writer); }
/// <summary> /// The write. /// </summary> /// <param name="mxMessage"> /// The mx message. /// </param> /// <param name="protoWriter"> /// The proto writer. /// </param> private static void Write(MxMessage mxMessage, ProtoWriter protoWriter) { if (mxMessage.GetType() != typeof(MxMessage)) { ThrowUnexpectedSubtype(typeof(MxMessage), mxMessage.GetType()); } uint expr_2D = mxMessage.ProtocolID; if (expr_2D != 0u) { ProtoWriter.WriteFieldHeader(1, WireType.Variant, protoWriter); ProtoWriter.WriteUInt32(expr_2D, protoWriter); } uint expr_4A = mxMessage.Sequence; if (expr_4A != 0u) { ProtoWriter.WriteFieldHeader(2, WireType.Variant, protoWriter); ProtoWriter.WriteUInt32(expr_4A, protoWriter); } uint expr_67 = mxMessage.Ack; if (expr_67 != 0u) { ProtoWriter.WriteFieldHeader(3, WireType.Variant, protoWriter); ProtoWriter.WriteUInt32(expr_67, protoWriter); } uint expr_84 = mxMessage.AckBitfield; if (expr_84 != 0u) { ProtoWriter.WriteFieldHeader(4, WireType.Variant, protoWriter); ProtoWriter.WriteUInt32(expr_84, protoWriter); } MxPayload[] expr_A1 = mxMessage.Payloads; if (expr_A1 != null) { MxPayload[] array = expr_A1; for (int i = 0; i < array.Length; i++) { MxPayload expr_B5 = array[i]; if (expr_B5 != null) { ProtoWriter.WriteFieldHeader(6, WireType.String, protoWriter); SubItemToken token = ProtoWriter.StartSubItem(expr_B5, protoWriter); Write(expr_B5, protoWriter); ProtoWriter.EndSubItem(token, protoWriter); } } } }
/// <summary> /// 获取数据 /// </summary> /// <param name="value">值</param> /// <param name="order">序号</param> /// <returns></returns> public static byte[] GetData(uint value, int order) { using (var ms = new MemoryStream()) { var writer = ProtoWriter.Create(ms, _typeModel); // 写入数据 ProtoWriter.WriteFieldHeader(order, WireType.Variant, writer); ProtoWriter.WriteUInt32(value, writer); // 释放缓冲区 writer.Close(); ms.Position = 0; var data = ms.ToArray(); return(data); } }
public void Write(object value, ProtoWriter dest) { ProtoWriter.WriteUInt32((uint)value, dest); }
/// <summary> /// This is the more "complete" version of Serialize, which handles single instances of mapped types. /// The value is written as a complete field, including field-header and (for sub-objects) a /// length-prefix /// In addition to that, this provides support for: /// - basic values; individual int / string / Guid / etc /// - IEnumerable sequences of any type handled by TrySerializeAuxiliaryType /// /// </summary> internal bool TrySerializeAuxiliaryType(ProtoWriter writer, Type type, DataFormat format, int tag, object value) { if (type == null) { type = value.GetType(); } TypeCode typecode = Type.GetTypeCode(type); int modelKey; // note the "ref type" here normalizes against proxies WireType wireType = GetWireType(typecode, format, ref type, out modelKey); if (modelKey >= 0) { // write the header, but defer to the model ProtoWriter.WriteFieldHeader(tag, wireType, writer); switch (wireType) { case WireType.None: throw ProtoWriter.CreateException(writer); case WireType.StartGroup: case WireType.String: // needs a wrapping length etc SubItemToken token = ProtoWriter.StartSubItem(value, writer); Serialize(modelKey, value, writer); ProtoWriter.EndSubItem(token, writer); return(true); default: Serialize(modelKey, value, writer); return(true); } } if (wireType != WireType.None) { ProtoWriter.WriteFieldHeader(tag, wireType, writer); } switch (typecode) { case TypeCode.Int16: ProtoWriter.WriteInt16((short)value, writer); return(true); case TypeCode.Int32: ProtoWriter.WriteInt32((int)value, writer); return(true); case TypeCode.Int64: ProtoWriter.WriteInt64((long)value, writer); return(true); case TypeCode.UInt16: ProtoWriter.WriteUInt16((ushort)value, writer); return(true); case TypeCode.UInt32: ProtoWriter.WriteUInt32((uint)value, writer); return(true); case TypeCode.UInt64: ProtoWriter.WriteUInt64((ulong)value, writer); return(true); case TypeCode.Boolean: ProtoWriter.WriteBoolean((bool)value, writer); return(true); case TypeCode.SByte: ProtoWriter.WriteSByte((sbyte)value, writer); return(true); case TypeCode.Byte: ProtoWriter.WriteByte((byte)value, writer); return(true); case TypeCode.Char: ProtoWriter.WriteUInt16((ushort)(char)value, writer); return(true); case TypeCode.Double: ProtoWriter.WriteDouble((double)value, writer); return(true); case TypeCode.Single: ProtoWriter.WriteSingle((float)value, writer); return(true); case TypeCode.DateTime: BclHelpers.WriteDateTime((DateTime)value, writer); return(true); case TypeCode.Decimal: BclHelpers.WriteDecimal((decimal)value, writer); return(true); case TypeCode.String: ProtoWriter.WriteString((string)value, writer); return(true); } if (type == typeof(byte[])) { ProtoWriter.WriteBytes((byte[])value, writer); return(true); } if (type == typeof(TimeSpan)) { BclHelpers.WriteTimeSpan((TimeSpan)value, writer); return(true); } if (type == typeof(Guid)) { BclHelpers.WriteGuid((Guid)value, writer); return(true); } if (type == typeof(Uri)) { ProtoWriter.WriteString(((Uri)value).AbsoluteUri, writer); return(true); } // by now, we should have covered all the simple cases; if we wrote a field-header, we have // forgotten something! Helpers.DebugAssert(wireType == WireType.None); // now attempt to handle sequences (including arrays and lists) IEnumerable sequence = value as IEnumerable; if (sequence != null) { foreach (object item in sequence) { if (item == null) { throw new NullReferenceException(); } if (!TrySerializeAuxiliaryType(writer, null, format, tag, item)) { ThrowUnexpectedType(item.GetType()); } } return(true); } return(false); }
/// <summary> /// 写出数据 /// </summary> /// <param name="writer">写出目标</param> /// <param name="obj">写出对象</param> /// <param name="field_desc">字段描述</param> /// <see cref="https://developers.google.com/protocol-buffers/docs/encoding"/> private void write_object(ProtoWriter writer, object obj, FieldDescriptorProto field_desc) { try { switch (field_desc.type) { case FieldDescriptorProto.Type.TYPE_DOUBLE: { double val = Convert.ToDouble(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed64, writer); ProtoWriter.WriteDouble(val, writer); break; } case FieldDescriptorProto.Type.TYPE_FLOAT: { float val = Convert.ToSingle(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed32, writer); ProtoWriter.WriteSingle(val, writer); break; } case FieldDescriptorProto.Type.TYPE_SINT64: case FieldDescriptorProto.Type.TYPE_INT64: { long val = Convert.ToInt64(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteInt64(val, writer); break; } case FieldDescriptorProto.Type.TYPE_UINT64: { ulong val = Convert.ToUInt64(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteUInt64(val, writer); break; } case FieldDescriptorProto.Type.TYPE_SINT32: case FieldDescriptorProto.Type.TYPE_INT32: { int val = Convert.ToInt32(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteInt32(val, writer); break; } case FieldDescriptorProto.Type.TYPE_FIXED64: { long val = Convert.ToInt64(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed64, writer); ProtoWriter.WriteInt64(val, writer); break; } case FieldDescriptorProto.Type.TYPE_FIXED32: { int val = Convert.ToInt32(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed32, writer); ProtoWriter.WriteInt32(val, writer); break; } case FieldDescriptorProto.Type.TYPE_BOOL: { bool val = Convert.ToBoolean(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteBoolean(val, writer); break; } case FieldDescriptorProto.Type.TYPE_STRING: { string val = Convert.ToString(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.String, writer); ProtoWriter.WriteString(val, writer); break; } //case FieldDescriptorProto.Type.TYPE_GROUP: // deprecated // break; case FieldDescriptorProto.Type.TYPE_MESSAGE: if (!(obj is DynamicMessage)) { lastError.AddLast(string.Format("try add {0} to {1}.{2}.{3}, but not a message", obj.ToString(), msgDescriptor.Package, msgDescriptor.Protocol.name, field_desc.name)); break; } ProtoWriter.WriteFieldHeader(field_desc.number, WireType.String, writer); SubItemToken token = ProtoWriter.StartSubItem(null, writer); try { ((DynamicMessage)obj).Serialize(writer); } catch (Exception e) { lastError.AddLast(string.Format("{0}.{1}.{2} => {3}", msgDescriptor.Package, msgDescriptor.Protocol.name, field_desc.name, e.Message)); } ProtoWriter.EndSubItem(token, writer); break; case FieldDescriptorProto.Type.TYPE_BYTES: { if (!(obj is byte[])) { throw new ArgumentException("{0} should be a byte[]", field_desc.name); } ProtoWriter.WriteFieldHeader(field_desc.number, WireType.String, writer); ProtoWriter.WriteBytes((byte[])obj, writer); break; } case FieldDescriptorProto.Type.TYPE_UINT32: { uint val = Convert.ToUInt32(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteUInt32(val, writer); break; } case FieldDescriptorProto.Type.TYPE_ENUM: { int val = Convert.ToInt32(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Variant, writer); ProtoWriter.WriteInt32(val, writer); break; } case FieldDescriptorProto.Type.TYPE_SFIXED32: { uint val = Convert.ToUInt32(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed32, writer); ProtoWriter.WriteUInt32(val, writer); break; } case FieldDescriptorProto.Type.TYPE_SFIXED64: { ulong val = Convert.ToUInt64(obj); ProtoWriter.WriteFieldHeader(field_desc.number, WireType.Fixed64, writer); ProtoWriter.WriteUInt64(val, writer); break; } default: // unsupported field lastError.AddLast(string.Format("field type {0} in {1}.{2}.{3} unsupported", field_desc.type.ToString(), msgDescriptor.Package, msgDescriptor.Protocol.name, field_desc.name)); break; } } catch (Exception e) { lastError.AddLast(string.Format("{0}.{1}.{2} {3}", msgDescriptor.Package, msgDescriptor.Protocol.name, field_desc.name, e.ToString())); } }
static void Main(string[] args) { Console.WriteLine($"Begin"); Console.WriteLine(); byte[] data; ValueDemo model; byte[] data1; MemoryStream ms; ProtoWriter writestate; var typeModel = RuntimeTypeModel.Create(); // Bool ms = new MemoryStream(); writestate = ProtoBuf.ProtoWriter.Create(ms, typeModel); ProtoWriter.WriteFieldHeader(3, WireType.Variant, writestate); ProtoWriter.WriteBoolean(true, writestate); writestate.Close(); ms.Position = 0; data = ms.ToArray(); model = new ValueDemo { Success = true }; data1 = ProtoBufSerializer.Serialize(model); ms.Close(); ms = null; Print("bool"); // Int32 ms = new MemoryStream(); writestate = ProtoBuf.ProtoWriter.Create(ms, typeModel); ProtoWriter.WriteFieldHeader(5, WireType.Variant, writestate); ProtoWriter.WriteInt32(500, writestate); writestate.Close(); ms.Position = 0; data = ms.ToArray(); model = new ValueDemo { Value = 500 }; data1 = ProtoBufSerializer.Serialize(model); ms.Close(); ms = null; Print("int32"); // Uint32 ms = new MemoryStream(); writestate = ProtoBuf.ProtoWriter.Create(ms, typeModel); ProtoWriter.WriteFieldHeader(4, WireType.Variant, writestate); ProtoWriter.WriteUInt32(UInt32.MaxValue, writestate); writestate.Close(); ms.Position = 0; data = ms.ToArray(); model = new ValueDemo { Values = UInt32.MaxValue }; data1 = ProtoBufSerializer.Serialize(model); ms.Close(); ms = null; Print("uint32"); Console.WriteLine(); Console.WriteLine($"End"); // Int32 void Print(string s) { Console.WriteLine($"{s} - wri: {BitConverter.ToString(data)}"); Console.WriteLine($"{s} - ser: {BitConverter.ToString(data1)}"); } }
internal bool TrySerializeAuxiliaryType(ProtoWriter writer, Type type, DataFormat format, int tag, object value, bool isInsideList) { if (type == null) { type = value.GetType(); } ProtoTypeCode typeCode = Helpers.GetTypeCode(type); int modelKey; WireType wireType = GetWireType(typeCode, format, ref type, out modelKey); if (modelKey >= 0) { if (Helpers.IsEnum(type)) { Serialize(modelKey, value, writer); return(true); } ProtoWriter.WriteFieldHeader(tag, wireType, writer); switch (wireType) { case WireType.None: throw ProtoWriter.CreateException(writer); case WireType.String: case WireType.StartGroup: { SubItemToken token = ProtoWriter.StartSubItem(value, writer); Serialize(modelKey, value, writer); ProtoWriter.EndSubItem(token, writer); return(true); } default: Serialize(modelKey, value, writer); return(true); } } if (wireType != WireType.None) { ProtoWriter.WriteFieldHeader(tag, wireType, writer); } switch (typeCode) { case ProtoTypeCode.Int16: ProtoWriter.WriteInt16((short)value, writer); return(true); case ProtoTypeCode.Int32: ProtoWriter.WriteInt32((int)value, writer); return(true); case ProtoTypeCode.Int64: ProtoWriter.WriteInt64((long)value, writer); return(true); case ProtoTypeCode.UInt16: ProtoWriter.WriteUInt16((ushort)value, writer); return(true); case ProtoTypeCode.UInt32: ProtoWriter.WriteUInt32((uint)value, writer); return(true); case ProtoTypeCode.UInt64: ProtoWriter.WriteUInt64((ulong)value, writer); return(true); case ProtoTypeCode.Boolean: ProtoWriter.WriteBoolean((bool)value, writer); return(true); case ProtoTypeCode.SByte: ProtoWriter.WriteSByte((sbyte)value, writer); return(true); case ProtoTypeCode.Byte: ProtoWriter.WriteByte((byte)value, writer); return(true); case ProtoTypeCode.Char: ProtoWriter.WriteUInt16((char)value, writer); return(true); case ProtoTypeCode.Double: ProtoWriter.WriteDouble((double)value, writer); return(true); case ProtoTypeCode.Single: ProtoWriter.WriteSingle((float)value, writer); return(true); case ProtoTypeCode.DateTime: BclHelpers.WriteDateTime((DateTime)value, writer); return(true); case ProtoTypeCode.Decimal: BclHelpers.WriteDecimal((decimal)value, writer); return(true); case ProtoTypeCode.String: ProtoWriter.WriteString((string)value, writer); return(true); case ProtoTypeCode.ByteArray: ProtoWriter.WriteBytes((byte[])value, writer); return(true); case ProtoTypeCode.TimeSpan: BclHelpers.WriteTimeSpan((TimeSpan)value, writer); return(true); case ProtoTypeCode.Guid: BclHelpers.WriteGuid((Guid)value, writer); return(true); case ProtoTypeCode.Uri: ProtoWriter.WriteString(((Uri)value).AbsoluteUri, writer); return(true); default: { IEnumerable enumerable = value as IEnumerable; if (enumerable != null) { if (isInsideList) { throw CreateNestedListsNotSupported(); } foreach (object item in enumerable) { if (item == null) { throw new NullReferenceException(); } if (!TrySerializeAuxiliaryType(writer, null, format, tag, item, isInsideList: true)) { ThrowUnexpectedType(item.GetType()); } } return(true); } return(false); } } }
public void Write(object value, ProtoWriter dest) { ProtoWriter.WriteUInt32(ValueObject.Value <uint>(value), dest); }
void WriteField(ProtoWriter writer, object memberV, Type memberT, int fieldNumber) { if (memberT == typeof(int)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteInt32((int)memberV, writer); } else if (memberT == typeof(uint)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteUInt32((uint)memberV, writer); } else if (memberT == typeof(bool)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteBoolean((bool)memberV, writer); } else if (memberT == typeof(byte)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteByte((byte)memberV, writer); } else if (memberT == typeof(sbyte)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteSByte((sbyte)memberV, writer); } else if (memberT == typeof(float)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteSingle((float)memberV, writer); } else if (memberT == typeof(double)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteDouble((double)memberV, writer); } else if (memberT == typeof(short)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteInt16((short)memberV, writer); } else if (memberT == typeof(ushort)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteUInt16((ushort)memberV, writer); } else if (memberT == typeof(long)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteInt64((long)memberV, writer); } else if (memberT == typeof(ulong)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, writer); ProtoWriter.WriteUInt64((ulong)memberV, writer); } else if (memberT == typeof(string)) { string str = (string)memberV; if (!string.IsNullOrEmpty(str)) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, writer); ProtoWriter.WriteString(str, writer); } } else if (memberT == typeof(byte[])) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, writer); ProtoWriter.WriteBytes((byte[])memberV, writer); } else if (memberT == typeof(SInstance)) { SInstance subSinstance = (SInstance)memberV; if (subSinstance != null) { ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, writer); SubItemToken st = ProtoWriter.StartSubItem(null, writer); WriteSInstance(writer, subSinstance); ProtoWriter.EndSubItem(st, writer); } } else { throw new NotImplementedException("未实现类型: " + memberT); } }
public void Write(ProtoWriter dest, ref ProtoWriter.State state, object value) { ProtoWriter.WriteUInt32((uint)value, dest, ref state); }