Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 4
0
 public void Write(object value, ProtoWriter dest)
 {
     ProtoWriter.WriteUInt32((uint)value, dest);
 }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
0
        /// <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()));
            }
        }
Ejemplo n.º 7
0
        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)}");
            }
        }
Ejemplo n.º 8
0
        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);
            }
            }
        }
Ejemplo n.º 9
0
 public void Write(object value, ProtoWriter dest)
 {
     ProtoWriter.WriteUInt32(ValueObject.Value <uint>(value), dest);
 }
Ejemplo n.º 10
0
 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);
     }
 }
Ejemplo n.º 11
0
 public void Write(ProtoWriter dest, ref ProtoWriter.State state, object value)
 {
     ProtoWriter.WriteUInt32((uint)value, dest, ref state);
 }