示例#1
0
            public void ShouldThrowExceptionOnColumnTypeInvalidFieldHeader()
            {
                // Arrange
                var stream = new MemoryStream();

                using (var writer = new ProtoWriter(stream, null, null))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);

                    var resultToken = ProtoWriter.StartSubItem(0, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);

                    var columnToken = ProtoWriter.StartSubItem(1, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("foo", writer);
                    ProtoWriter.WriteFieldHeader(42, WireType.Variant, writer);
                    ProtoWriter.WriteInt32((int)1, writer);

                    ProtoWriter.EndSubItem(columnToken, writer);

                    ProtoWriter.EndSubItem(resultToken, writer);
                }

                stream.Position = 0;

                // Assert
                Assert.Throws <InvalidDataException>(() => new ProtoDataReader(stream));
            }
示例#2
0
        public override void Write(object value, ProtoWriter dest)
        {
            Action metaWriter =
                () =>
            {
                // we still write length in case it will be read as array
                int length = (value as ICollection)?.Count ?? 0;
                if (length > 0)
                {
                    ProtoWriter.WriteFieldHeader(ListHelpers.FieldLength, WireType.Variant, dest);
                    ProtoWriter.WriteInt32(length, dest);
                }
                if (_writeSubType)
                {
                    Type t = value.GetType();
                    if (_concreteTypeDefault != t)
                    {
                        ProtoWriter.WriteFieldHeaderBegin(ListHelpers.FieldSubtype, dest);
                        _subTypeHelpers.Write(_metaType, t, dest);
                    }
                }
            };

            ListHelpers.Write(value, metaWriter, null, dest);
        }
示例#3
0
            public void ShouldAcceptTrailingFieldHeaders()
            {
                // Arrange
                var stream = new MemoryStream();

                using (var writer = new ProtoWriter(stream, null, null))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);

                    var resultToken = ProtoWriter.StartSubItem(0, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);

                    var columnToken = ProtoWriter.StartSubItem(1, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("foo", writer);
                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    ProtoWriter.WriteInt32((int)1, writer);
                    ProtoWriter.WriteFieldHeader(42, WireType.String, writer);
                    ProtoWriter.WriteString("bar", writer);

                    ProtoWriter.EndSubItem(columnToken, writer);

                    ProtoWriter.EndSubItem(resultToken, writer);
                }

                stream.Position = 0;

                // Assert
                new ProtoDataReader(stream);
            }
        public void CanWriteMessageSetData()
        {
            using (var ms = new MemoryStream())
            {
                using (var writer = new ProtoWriter(ms, null, null))
                {
                    ProtoWriter.WriteFieldHeader(5, WireType.String, writer);
                    var tok = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.StartGroup, writer);
                    var tok2 = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    ProtoWriter.WriteInt32(15447542, writer);

                    ProtoWriter.WriteFieldHeader(3, WireType.String, writer);
                    var tok3 = ProtoWriter.StartSubItem(null, writer);

                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString("EmbeddedMessageSetElement", writer);

                    ProtoWriter.EndSubItem(tok3, writer);
                    ProtoWriter.EndSubItem(tok2, writer);

                    ProtoWriter.EndSubItem(tok, writer);
                }

                var hex = BitConverter.ToString(ms.ToArray(), 0, (int)ms.Length);
                Assert.Equal("2A-24-0B-10-F6-EB-AE-07-1A-1B-0A-19"
                             + "-45-6D-62-65-64-64-65-64-4D-65-73-73-61-67-65-53"
                             + "-65-74-45-6C-65-6D-65-6E-74-0C", hex);
            }
        }
示例#5
0
        public void Write(object value, ProtoWriter dest)
        {
            if (map == null)
            {
#if TTD_LONGENUMS
                ProtoWriter.WriteInt64(EnumToWire(value), dest);
#else
                ProtoWriter.WriteInt32(EnumToWire(value), dest);
#endif
            }
            else
            {
                for (int i = 0; i < map.Length; i++)
                {
                    if (object.Equals(map[i].TypedValue, value))
                    {
#if TTD_LONGENUMS
                        ProtoWriter.WriteInt64(map[i].WireValue, dest);
#else
                        ProtoWriter.WriteInt32(map[i].WireValue, dest);
#endif
                        return;
                    }
                }
                ProtoWriter.ThrowEnumException(dest, value);
            }
        }
        private void WriteRowId(ProtoWriter writer, TableUpdate value, int operationType)
        {
            ProtoWriter.WriteFieldHeader(operationType, WireType.StartGroup, writer);
            var token = ProtoWriter.StartSubItem(value.RowIndex, writer);

            ProtoWriter.WriteFieldHeader(ProtobufFieldIds.RowId, WireType.Variant, writer);
            ProtoWriter.WriteInt32(value.RowIndex, writer);
            ProtoWriter.EndSubItem(token, writer);
        }
示例#7
0
 public override void Write(object value, ProtoWriter dest)
 {
     _listHelpers.Write(value,
                        () =>
     {
         int length = ((Array)value).Length;
         if (length > 0)
         {
             ProtoWriter.WriteFieldHeader(ListHelpers.FieldLength, WireType.Variant, dest);
             ProtoWriter.WriteInt32(length, dest);
         }
     }, null, dest);
 }
 public override void Write(object value, ProtoWriter dest)
 {
     _listHelpers.Write(value,
                        () =>
     {
         var arr = (Array)value;
         for (int i = 0; i < _rank; i++)
         {
             ProtoWriter.WriteFieldHeader(ListHelpers.FieldLength, WireType.Variant, dest);
             ProtoWriter.WriteInt32(arr.GetLength(i), dest);
         }
     }, null, dest);
 }
        private static SubItemToken WriteStartUpdate(ProtoWriter writer, int rowIndex, out int rowId)
        {
            // Start the row group
            ProtoWriter.WriteFieldHeader(ProtobufOperationTypes.Update, WireType.StartGroup, writer);
            var token = ProtoWriter.StartSubItem(rowIndex, writer);

            rowId = rowIndex;

            // Send the row id so that it can be matched against the local row id at the other end.
            ProtoWriter.WriteFieldHeader(ProtobufFieldIds.RowId, WireType.Variant, writer);
            ProtoWriter.WriteInt32(rowId, writer);
            return(token);
        }
        public void Write(object value, ProtoWriter dest)
        {
            UnityEngine.LayerMask data = (UnityEngine.LayerMask)value;

            SubItemToken token = ProtoWriter.StartSubItem(value, dest);

            ProtoWriter.WriteFieldHeader(1, WireType.Variant, dest);
            ProtoWriter.WriteInt32(data.value, dest);



            ProtoWriter.EndSubItem(token, dest);
        }
        private static void WriteColumn(ProtoWriter writer, ProtoBufDataColumn column)
        {
            ProtoWriter.WriteFieldHeader(FieldHeaders.Column, WireType.StartGroup, writer);

            var columnToken = ProtoWriter.StartSubItem(column, writer);

            ProtoWriter.WriteFieldHeader(FieldHeaders.ColumnName, WireType.String, writer);
            ProtoWriter.WriteString(column.Name, writer);
            ProtoWriter.WriteFieldHeader(FieldHeaders.ColumnType, WireType.Variant, writer);
            ProtoWriter.WriteInt32((int)column.ProtoBufDataType, writer);

            ProtoWriter.EndSubItem(columnToken, writer);
        }
示例#12
0
 public void Write(object value, ProtoWriter dest)
 {
     if (map == null)
     {
         ProtoWriter.WriteInt32(EnumToWire(value), dest);
         return;
     }
     for (int i = 0; i < map.Length; i++)
     {
         if (object.Equals(map[i].TypedValue, value))
         {
             ProtoWriter.WriteInt32(map[i].WireValue, dest);
             return;
         }
     }
     ProtoWriter.ThrowEnumException(dest, value);
 }
示例#13
0
 public void TestVariantInt32()
 {
     for (int i = 0; i < 128; i++)
     {
         Util.Test(pw =>
         {
             ProtoWriter.WriteFieldHeader(1, WireType.Variant, pw);
             ProtoWriter.WriteInt32(i, pw);
         }, "08"   // 1 * 8 + 0
                   + i.ToString("X2")
                   );
     }
     Util.Test(pw => {
         ProtoWriter.WriteFieldHeader(1, WireType.Variant, pw);
         ProtoWriter.WriteInt32(128, pw);
     }, "088001");
 }
示例#14
0
        void Write(MetaType metaType, Type actual, ProtoWriter dest, int recursionLevel)
        {
            if (metaType.Type != actual)
            {
                foreach (var subType in metaType.GetSubtypes().OrderBy(st => st.FieldNumber))
                {
                    MetaType derivedType = subType.DerivedType;
                    if (derivedType.Type == metaType.Type)
                    {
                        continue;
                    }
                    if (Helpers.IsAssignableFrom(derivedType.Type, actual))
                    {
                        if (recursionLevel == 0)
                        {
                            if (derivedType.Type == actual)
                            {
                                ProtoWriter.WriteFieldHeaderComplete(WireType.Variant, dest);
                                ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                                return;
                            }

                            var token = ProtoWriter.StartSubItem(null, true, dest);
                            ProtoWriter.WriteFieldHeaderIgnored(WireType.Variant, dest);
                            ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                            Write(derivedType, actual, dest, 1);
                            ProtoWriter.EndSubItem(token, dest);
                        }
                        else
                        {
                            ProtoWriter.WriteFieldHeaderIgnored(WireType.Variant, dest);
                            ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                            Write(derivedType, actual, dest, recursionLevel + 1);
                        }
                        return;
                    }
                }
            }

            if (recursionLevel == 0)
            {
                ProtoWriter.WriteFieldHeaderComplete(WireType.Variant, dest);
                ProtoWriter.WriteInt32(0, dest);
            }
        }
        /// <summary>
        /// 获取数据
        /// </summary>
        /// <param name="value">值</param>
        /// <param name="order">序号</param>
        /// <returns></returns>
        public static byte[] GetData(int value, int order)
        {
            using (var ms = new MemoryStream())
            {
                var writer = ProtoWriter.Create(ms, _typeModel);

                // 写入数据
                ProtoWriter.WriteFieldHeader(order, WireType.Variant, writer);
                ProtoWriter.WriteInt32(value, writer);

                // 释放缓冲区
                writer.Close();

                ms.Position = 0;
                var data = ms.ToArray();

                return(data);
            }
        }
示例#16
0
        public void WriteHeader(IEnumerable <ProtoDataColumn> columns)
        {
            if (columns == null)
            {
                throw new ArgumentNullException("columns");
            }

            foreach (ProtoDataColumn column in columns)
            {
                // for each, write the name and data type
                ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, this.writer);
                SubItemToken columnToken = ProtoWriter.StartSubItem(column, this.writer);
                ProtoWriter.WriteFieldHeader(1, WireType.String, this.writer);
                ProtoWriter.WriteString(column.Name, this.writer);
                ProtoWriter.WriteFieldHeader(2, WireType.Variant, this.writer);
                ProtoWriter.WriteInt32((int)column.ProtoDataType, this.writer);
                ProtoWriter.EndSubItem(columnToken, this.writer);
            }
        }
示例#17
0
        public void writeSingle(float value, WireType wireType)
        {
            switch (wireType)
            {
            case WireType.Fixed32:
#if FEAT_SAFE
                ProtoWriter.WriteInt32(BitConverter.ToInt32(BitConverter.GetBytes(value), 0), writer);
#else
                writeInt32(*(int *)&value, wireType);
#endif
                return;

            case WireType.Fixed64:
                writeDouble((double)value, wireType);
                return;

            default:
                throw createException(wireType);
            }
        }
        public void Write(object value, ProtoWriter dest)
        {
            UnityEngine.AnimationCurve data = (UnityEngine.AnimationCurve)value;

            SubItemToken token = ProtoWriter.StartSubItem(value, dest);

            ProtoWriter.WriteFieldHeader(1, WireType.Variant, dest);
            ProtoWriter.WriteInt32((int)data.preWrapMode, dest);

            ProtoWriter.WriteFieldHeader(2, WireType.Variant, dest);
            ProtoWriter.WriteInt32((int)data.postWrapMode, dest);

            for (int i = 0; i < data.keys.Length; ++i)
            {
                ProtoWriter.WriteFieldHeader(3, WireType.String, dest);
                this.keyframeSerializer.Write(data.keys[i], dest);
            }


            ProtoWriter.EndSubItem(token, dest);
        }
示例#19
0
        public void Write(object value, ProtoWriter dest)
        {
            UnityEngine.Gradient data = (UnityEngine.Gradient)value;

            SubItemToken token = ProtoWriter.StartSubItem(value, dest);

            ProtoWriter.WriteFieldHeader(1, WireType.Variant, dest);
            ProtoWriter.WriteInt32((int)data.mode, dest);

            for (int i = 0; i < data.alphaKeys.Length; ++i)
            {
                ProtoWriter.WriteFieldHeader(2, WireType.String, dest);
                this.alphaKeySerializer.Write(data.alphaKeys[i], dest);
            }

            for (int i = 0; i < data.colorKeys.Length; ++i)
            {
                ProtoWriter.WriteFieldHeader(3, WireType.String, dest);
                this.colorKeySerializer.Write(data.colorKeys[i], dest);
            }

            ProtoWriter.EndSubItem(token, dest);
        }
        public void Write(object value, ProtoWriter dest)
        {
            UnityEngine.Keyframe data = (UnityEngine.Keyframe)value;

            SubItemToken token = ProtoWriter.StartSubItem(value, dest);

            ProtoWriter.WriteFieldHeader(1, WireType.Fixed32, dest);
            ProtoWriter.WriteSingle(data.time, dest);

            ProtoWriter.WriteFieldHeader(2, WireType.Fixed32, dest);
            ProtoWriter.WriteSingle(data.value, dest);

            ProtoWriter.WriteFieldHeader(3, WireType.Fixed32, dest);
            ProtoWriter.WriteSingle(data.inTangent, dest);

            ProtoWriter.WriteFieldHeader(4, WireType.Fixed32, dest);
            ProtoWriter.WriteSingle(data.outTangent, dest);

            ProtoWriter.WriteFieldHeader(5, WireType.Variant, dest);
            ProtoWriter.WriteInt32(data.tangentMode, dest);

            ProtoWriter.EndSubItem(token, dest);
        }
示例#21
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()));
            }
        }
        static void ProtoWrite(DataTable table, Stream stream)
        {
            using (var writer = new ProtoWriter(stream, null, null))
            {
                // table name
                if (!string.IsNullOrEmpty(table.TableName))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString(table.TableName, writer);
                }

                // write the schema:
                var cols = table.Columns;
                Action <object>[] colWriters = new Action <object> [cols.Count];
                int i = 0;

                foreach (DataColumn col in cols)
                {
                    // for each, write the name and data type
                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);
                    var token = ProtoWriter.StartSubItem(col, writer);
                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString(col.ColumnName, writer);
                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    MappedType type;
                    switch (Type.GetTypeCode(col.DataType))
                    {
                    case TypeCode.Decimal: type = MappedType.Decimal; break;

                    case TypeCode.Int16: type = MappedType.Int16; break;

                    case TypeCode.Int32: type = MappedType.Int32; break;

                    case TypeCode.String: type = MappedType.String; break;

                    case TypeCode.DateTime: type = MappedType.DateTime; break;

                    default:
                        if (col.DataType == typeof(Guid))
                        {
                            type = MappedType.Guid; break;
                        }
                        throw new NotSupportedException(col.DataType.Name);
                    }
                    ProtoWriter.WriteInt32((int)type, writer);
                    ProtoWriter.EndSubItem(token, writer);
                    int             field = i + 1;
                    Action <object> colWriter;
                    switch (type)
                    {
                    case MappedType.String:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.String, writer);
                            ProtoWriter.WriteString((string)value, writer);
                        };
                        break;

                    case MappedType.Int16:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                            ProtoWriter.WriteInt16((short)value, writer);
                        };
                        break;

                    case MappedType.Decimal:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                            BclHelpers.WriteDecimal((decimal)value, writer);
                        };
                        break;

                    case MappedType.Int32:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                            ProtoWriter.WriteInt32((int)value, writer);
                        };
                        break;

                    case MappedType.Guid:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                            BclHelpers.WriteGuid((Guid)value, writer);
                        };
                        break;

                    case MappedType.DateTime:
                        colWriter = value =>
                        {
                            ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                            BclHelpers.WriteDateTime((DateTime)value, writer);
                        };
                        break;

                    default:
                        throw new NotSupportedException(col.DataType.Name);
                    }
                    colWriters[i++] = colWriter;
                }
                // write the rows
                foreach (DataRow row in table.Rows)
                {
                    i = 0;
                    ProtoWriter.WriteFieldHeader(3, WireType.StartGroup, writer);
                    var token = ProtoWriter.StartSubItem(row, writer);
                    foreach (DataColumn col in cols)
                    {
                        var value = row[col];
                        if (value == null || value is DBNull)
                        {
                        }
                        else
                        {
                            colWriters[i](value);
                        }
                        i++;
                    }
                    ProtoWriter.EndSubItem(token, writer);
                }
            }
        }
示例#23
0
        public static void WriteRecord(ProtoWriterContext context, int recordIndex, IDataRecord record)
        {
            ProtoWriter.WriteFieldHeader(RecordFieldHeader, WireType.StartGroup, context.Writer);

            context.StartSubItem(recordIndex);

            for (var columnIndex = 0; columnIndex < context.Columns.Count; columnIndex++)
            {
                // The check whether record[columnIndex] == null is removed due to the fact that value types have to be
                // boxed into an object just to check whether the field value is null. This creates garbage, thus has
                // impact on garbage collection. Removing the check should not be a problem as IDataRecord.IsDBNull
                // should be sufficient (tested with SqlDataReader, SqlLiteDataReader, and DataTableReader).
                if (record.IsDBNull(columnIndex))
                {
                    continue;
                }

                var fieldNumber = columnIndex + 1;

                switch (context.Columns[columnIndex].ProtoDataType)
                {
                case ProtoDataType.String:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, context.Writer);
                    ProtoWriter.WriteString(record.GetString(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Short:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteInt16(record.GetInt16(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Decimal:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.StartGroup, context.Writer);
                    BclHelpers.WriteDecimal(record.GetDecimal(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Int:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteInt32(record.GetInt32(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Guid:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.StartGroup, context.Writer);
                    BclHelpers.WriteGuid(record.GetGuid(columnIndex), context.Writer);
                    break;

                case ProtoDataType.DateTime:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.StartGroup, context.Writer);
                    BclHelpers.WriteDateTime(record.GetDateTime(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Bool:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteBoolean(record.GetBoolean(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Byte:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteByte(record.GetByte(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Char:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteInt16((short)record.GetChar(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Double:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Fixed64, context.Writer);
                    ProtoWriter.WriteDouble(record.GetDouble(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Float:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Fixed32, context.Writer);
                    ProtoWriter.WriteSingle(record.GetFloat(columnIndex), context.Writer);
                    break;

                case ProtoDataType.Long:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.Variant, context.Writer);
                    ProtoWriter.WriteInt64(record.GetInt64(columnIndex), context.Writer);
                    break;

                case ProtoDataType.ByteArray:
                    var bytes = (byte[])record[columnIndex];

                    if (bytes.Length != 0 || !context.Options.SerializeEmptyArraysAsNull)
                    {
                        ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, context.Writer);
                        ProtoWriter.WriteBytes(bytes, 0, bytes.Length, context.Writer);
                    }

                    break;

                case ProtoDataType.CharArray:
                    var characters = (char[])record[columnIndex];

                    if (characters.Length != 0 || !context.Options.SerializeEmptyArraysAsNull)
                    {
                        ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, context.Writer);
                        ProtoWriter.WriteString(new string(characters), context.Writer);
                    }

                    break;

                case ProtoDataType.TimeSpan:
                    ProtoWriter.WriteFieldHeader(fieldNumber, WireType.StartGroup, context.Writer);
                    BclHelpers.WriteTimeSpan((TimeSpan)record[columnIndex], context.Writer);
                    break;

                default:
                    throw new NotSupportedException($"The data type '{context.Columns[columnIndex].DataType.Name}' is not supported. The supported data types are: {TypeHelper.GetSupportedDataTypes()}.");
                }
            }

            context.EndSubItem();
        }
示例#24
0
        public static void ProtoWrite(DataTable table, Stream stream)
        {
            using (ProtoWriter writer = new ProtoWriter(stream, null, null))
            {
                if (!string.IsNullOrEmpty(table.TableName))
                {
                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString(table.TableName, writer);
                }
                DataColumnCollection columns     = table.Columns;
                Action <object>[]    actionArray = new Action <object> [columns.Count];
                int index = 0;
                foreach (DataColumn column in columns)
                {
                    MappedType      boolean;
                    Action <object> action;
                    Action <object> action2  = null;
                    Action <object> action3  = null;
                    Action <object> action4  = null;
                    Action <object> action5  = null;
                    Action <object> action6  = null;
                    Action <object> action7  = null;
                    Action <object> action8  = null;
                    Action <object> action9  = null;
                    Action <object> action10 = null;
                    Action <object> action11 = null;
                    Action <object> action12 = null;
                    ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);
                    SubItemToken token = ProtoWriter.StartSubItem(column, writer);
                    ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                    ProtoWriter.WriteString(column.ColumnName, writer);
                    ProtoWriter.WriteFieldHeader(2, WireType.Variant, writer);
                    switch (Type.GetTypeCode(column.DataType))
                    {
                    case TypeCode.Boolean:
                        boolean = MappedType.Boolean;
                        break;

                    case TypeCode.Byte:
                        boolean = MappedType.Byte;
                        break;

                    case TypeCode.Int16:
                        boolean = MappedType.Int16;
                        break;

                    case TypeCode.Int32:
                        boolean = MappedType.Int32;
                        break;

                    case TypeCode.Int64:
                        boolean = MappedType.Int64;
                        break;

                    case TypeCode.Double:
                        boolean = MappedType.Double;
                        break;

                    case TypeCode.Decimal:
                        boolean = MappedType.Decimal;
                        break;

                    case TypeCode.DateTime:
                        boolean = MappedType.DateTime;
                        break;

                    case TypeCode.String:
                        boolean = MappedType.String;
                        break;

                    default:
                        if (column.DataType == typeof(Guid))
                        {
                            boolean = MappedType.Guid;
                        }
                        else if (column.DataType == typeof(byte[]))
                        {
                            boolean = MappedType.Byte;
                        }
                        else
                        {
                            if (column.DataType != typeof(TimeSpan))
                            {
                                throw new NotSupportedException(column.DataType.Name);
                            }
                            boolean = MappedType.TimeSpan;
                        }
                        break;
                    }
                    ProtoWriter.WriteInt32((int)boolean, writer);
                    ProtoWriter.WriteFieldHeader(3, WireType.String, writer);
                    ProtoWriter.WriteString(column.Caption, writer);
                    ProtoWriter.EndSubItem(token, writer);
                    int field = index + 1;
                    switch (boolean)
                    {
                    case MappedType.Boolean:
                        if (action2 == null)
                        {
                            action2 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                                ProtoWriter.WriteBoolean(Convert.ToBoolean(value), writer);
                            };
                        }
                        action = action2;
                        break;

                    case MappedType.Byte:
                        if (action3 == null)
                        {
                            action3 = delegate(object value)
                            {
                                byte[] inArray = value as byte[];
                                string str     = Convert.ToBase64String(inArray);
                                ProtoWriter.WriteFieldHeader(field, WireType.String, writer);
                                ProtoWriter.WriteString(str, writer);
                            };
                        }
                        action = action3;
                        break;

                    case MappedType.Double:
                        if (action4 == null)
                        {
                            action4 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.Fixed64, writer);
                                ProtoWriter.WriteDouble(Convert.ToDouble(value), writer);
                            };
                        }
                        action = action4;
                        break;

                    case MappedType.Int16:
                        if (action7 == null)
                        {
                            action7 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                                ProtoWriter.WriteInt16((short)value, writer);
                            };
                        }
                        action = action7;
                        break;

                    case MappedType.Int32:
                        if (action8 == null)
                        {
                            action8 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                                ProtoWriter.WriteInt32(Convert.ToInt32(value), writer);
                            };
                        }
                        action = action8;
                        break;

                    case MappedType.Int64:
                        if (action9 == null)
                        {
                            action9 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.Variant, writer);
                                ProtoWriter.WriteInt64((long)value, writer);
                            };
                        }
                        action = action9;
                        break;

                    case MappedType.String:
                        if (action5 == null)
                        {
                            action5 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.String, writer);
                                ProtoWriter.WriteString(Convert.ToString(value), writer);
                            };
                        }
                        action = action5;
                        break;

                    case MappedType.Decimal:
                        if (action6 == null)
                        {
                            action6 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                                BclHelpers.WriteDecimal(Convert.ToDecimal(value), writer);
                            };
                        }
                        action = action6;
                        break;

                    case MappedType.Guid:
                        if (action10 == null)
                        {
                            action10 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                                BclHelpers.WriteGuid((Guid)value, writer);
                            };
                        }
                        action = action10;
                        break;

                    case MappedType.DateTime:
                        if (action11 == null)
                        {
                            action11 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                                BclHelpers.WriteDateTime(Convert.ToDateTime(value), writer);
                            };
                        }
                        action = action11;
                        break;

                    case MappedType.TimeSpan:
                        if (action12 == null)
                        {
                            action12 = delegate(object value)
                            {
                                ProtoWriter.WriteFieldHeader(field, WireType.StartGroup, writer);
                                if (value is TimeSpan)
                                {
                                    BclHelpers.WriteTimeSpan((TimeSpan)value, writer);
                                }
                                else
                                {
                                    BclHelpers.WriteTimeSpan(TimeSpan.Zero, writer);
                                }
                            };
                        }
                        action = action12;
                        break;

                    default:
                        throw new NotSupportedException(column.DataType.Name);
                    }
                    actionArray[index++] = action;
                }
                foreach (DataRow row in table.Rows)
                {
                    index = 0;
                    ProtoWriter.WriteFieldHeader(3, WireType.StartGroup, writer);
                    SubItemToken token2 = ProtoWriter.StartSubItem(row, writer);
                    foreach (DataColumn column2 in columns)
                    {
                        object obj2 = row[column2];
                        if ((obj2 != null) && !(obj2 is DBNull))
                        {
                            actionArray[index](obj2);
                        }
                        index++;
                    }
                    ProtoWriter.EndSubItem(token2, writer);
                }
            }
        }
 /// <summary>
 /// The write.
 /// </summary>
 /// <param name="targetPlatform">
 /// The target platform.
 /// </param>
 /// <param name="writer">
 /// The writer.
 /// </param>
 private static void Write(TargetPlatform targetPlatform, ProtoWriter writer)
 {
     ProtoWriter.WriteFieldHeader(1, WireType.Variant, writer);
     if (targetPlatform != TargetPlatform.Windows)
     {
         if (targetPlatform != TargetPlatform.Xbox360)
         {
             if (targetPlatform != TargetPlatform.WindowsPhone)
             {
                 if (targetPlatform != TargetPlatform.iOS)
                 {
                     if (targetPlatform != TargetPlatform.Android)
                     {
                         if (targetPlatform != TargetPlatform.Linux)
                         {
                             if (targetPlatform != TargetPlatform.MacOSX)
                             {
                                 if (targetPlatform != TargetPlatform.WindowsStoreApp)
                                 {
                                     if (targetPlatform != TargetPlatform.NativeClient)
                                     {
                                         if (targetPlatform != TargetPlatform.Ouya)
                                         {
                                             if (targetPlatform != TargetPlatform.PlayStationMobile)
                                             {
                                                 if (targetPlatform != TargetPlatform.WindowsPhone8)
                                                 {
                                                     if (targetPlatform != TargetPlatform.RaspberryPi)
                                                     {
                                                         ProtoWriter.ThrowEnumException(writer, targetPlatform);
                                                     }
                                                     else
                                                     {
                                                         ProtoWriter.WriteInt32(12, writer);
                                                     }
                                                 }
                                                 else
                                                 {
                                                     ProtoWriter.WriteInt32(11, writer);
                                                 }
                                             }
                                             else
                                             {
                                                 ProtoWriter.WriteInt32(10, writer);
                                             }
                                         }
                                         else
                                         {
                                             ProtoWriter.WriteInt32(9, writer);
                                         }
                                     }
                                     else
                                     {
                                         ProtoWriter.WriteInt32(8, writer);
                                     }
                                 }
                                 else
                                 {
                                     ProtoWriter.WriteInt32(7, writer);
                                 }
                             }
                             else
                             {
                                 ProtoWriter.WriteInt32(6, writer);
                             }
                         }
                         else
                         {
                             ProtoWriter.WriteInt32(5, writer);
                         }
                     }
                     else
                     {
                         ProtoWriter.WriteInt32(4, writer);
                     }
                 }
                 else
                 {
                     ProtoWriter.WriteInt32(3, writer);
                 }
             }
             else
             {
                 ProtoWriter.WriteInt32(2, writer);
             }
         }
         else
         {
             ProtoWriter.WriteInt32(1, writer);
         }
     }
     else
     {
         ProtoWriter.WriteInt32(0, writer);
     }
 }
        /// <summary>
        /// The write.
        /// </summary>
        /// <param name="platformData">
        /// The platform data.
        /// </param>
        /// <param name="writer">
        /// The writer.
        /// </param>
        private static void Write(PlatformData platformData, ProtoWriter writer)
        {
            if (platformData.GetType() != typeof(PlatformData))
            {
                ThrowUnexpectedSubtype(typeof(PlatformData), platformData.GetType());
            }

            TargetPlatform expr_2D = platformData.Platform;

            if (expr_2D != TargetPlatform.Windows)
            {
                ProtoWriter.WriteFieldHeader(1, WireType.Variant, writer);
                TargetPlatform targetPlatform = expr_2D;
                if (targetPlatform != TargetPlatform.Windows)
                {
                    if (targetPlatform != TargetPlatform.Xbox360)
                    {
                        if (targetPlatform != TargetPlatform.WindowsPhone)
                        {
                            if (targetPlatform != TargetPlatform.iOS)
                            {
                                if (targetPlatform != TargetPlatform.Android)
                                {
                                    if (targetPlatform != TargetPlatform.Linux)
                                    {
                                        if (targetPlatform != TargetPlatform.MacOSX)
                                        {
                                            if (targetPlatform != TargetPlatform.WindowsStoreApp)
                                            {
                                                if (targetPlatform != TargetPlatform.NativeClient)
                                                {
                                                    if (targetPlatform != TargetPlatform.Ouya)
                                                    {
                                                        if (targetPlatform != TargetPlatform.PlayStationMobile)
                                                        {
                                                            if (targetPlatform != TargetPlatform.WindowsPhone8)
                                                            {
                                                                if (targetPlatform != TargetPlatform.RaspberryPi)
                                                                {
                                                                    ProtoWriter.ThrowEnumException(
                                                                        writer,
                                                                        targetPlatform);
                                                                }
                                                                else
                                                                {
                                                                    ProtoWriter.WriteInt32(12, writer);
                                                                }
                                                            }
                                                            else
                                                            {
                                                                ProtoWriter.WriteInt32(11, writer);
                                                            }
                                                        }
                                                        else
                                                        {
                                                            ProtoWriter.WriteInt32(10, writer);
                                                        }
                                                    }
                                                    else
                                                    {
                                                        ProtoWriter.WriteInt32(9, writer);
                                                    }
                                                }
                                                else
                                                {
                                                    ProtoWriter.WriteInt32(8, writer);
                                                }
                                            }
                                            else
                                            {
                                                ProtoWriter.WriteInt32(7, writer);
                                            }
                                        }
                                        else
                                        {
                                            ProtoWriter.WriteInt32(6, writer);
                                        }
                                    }
                                    else
                                    {
                                        ProtoWriter.WriteInt32(5, writer);
                                    }
                                }
                                else
                                {
                                    ProtoWriter.WriteInt32(4, writer);
                                }
                            }
                            else
                            {
                                ProtoWriter.WriteInt32(3, writer);
                            }
                        }
                        else
                        {
                            ProtoWriter.WriteInt32(2, writer);
                        }
                    }
                    else
                    {
                        ProtoWriter.WriteInt32(1, writer);
                    }
                }
                else
                {
                    ProtoWriter.WriteInt32(0, writer);
                }
            }

            byte[] expr_143 = platformData.Data;
            if (expr_143 != null)
            {
                ProtoWriter.WriteFieldHeader(2, WireType.String, writer);
                ProtoWriter.WriteBytes(expr_143, writer);
            }
        }
示例#27
0
        private static void WriteTimeSpanImpl(TimeSpan timeSpan, ProtoWriter dest, DateTimeKind kind)
        {
            if (dest == null)
            {
                throw new ArgumentNullException(nameof(dest));
            }
            switch (dest.WireType)
            {
            case WireType.String:
            case WireType.StartGroup:
                TimeSpanScale scale;
                long          value = timeSpan.Ticks;
                if (timeSpan == TimeSpan.MaxValue)
                {
                    value = 1;
                    scale = TimeSpanScale.MinMax;
                }
                else if (timeSpan == TimeSpan.MinValue)
                {
                    value = -1;
                    scale = TimeSpanScale.MinMax;
                }
                else if (value % TimeSpan.TicksPerDay == 0)
                {
                    scale  = TimeSpanScale.Days;
                    value /= TimeSpan.TicksPerDay;
                }
                else if (value % TimeSpan.TicksPerHour == 0)
                {
                    scale  = TimeSpanScale.Hours;
                    value /= TimeSpan.TicksPerHour;
                }
                else if (value % TimeSpan.TicksPerMinute == 0)
                {
                    scale  = TimeSpanScale.Minutes;
                    value /= TimeSpan.TicksPerMinute;
                }
                else if (value % TimeSpan.TicksPerSecond == 0)
                {
                    scale  = TimeSpanScale.Seconds;
                    value /= TimeSpan.TicksPerSecond;
                }
                else if (value % TimeSpan.TicksPerMillisecond == 0)
                {
                    scale  = TimeSpanScale.Milliseconds;
                    value /= TimeSpan.TicksPerMillisecond;
                }
                else
                {
                    scale = TimeSpanScale.Ticks;
                }

                SubItemToken token = ProtoWriter.StartSubItemWithoutWritingHeader(null, dest);

                if (value != 0)
                {
                    ProtoWriter.WriteFieldHeader(FieldTimeSpanValue, WireType.SignedVariant, dest);
                    ProtoWriter.WriteInt64(value, dest);
                }
                if (scale != TimeSpanScale.Days)
                {
                    ProtoWriter.WriteFieldHeader(FieldTimeSpanScale, WireType.Variant, dest);
                    ProtoWriter.WriteInt32((int)scale, dest);
                }
                if (kind != DateTimeKind.Unspecified)
                {
                    ProtoWriter.WriteFieldHeader(FieldTimeSpanKind, WireType.Variant, dest);
                    ProtoWriter.WriteInt32((int)kind, dest);
                }
                ProtoWriter.EndSubItem(token, dest);
                break;

            case WireType.Fixed64:
                ProtoWriter.WriteInt64(timeSpan.Ticks, dest);
                break;

            default:
                throw new ProtoException("Unexpected wire-type: " + dest.WireType.ToString());
            }
        }
示例#28
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)}");
            }
        }
示例#29
0
 // Token: 0x06003582 RID: 13698 RVA: 0x00134A7B File Offset: 0x00132E7B
 public void Write(object value, ProtoWriter dest)
 {
     ProtoWriter.WriteInt32((int)value, dest);
 }
示例#30
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);
        }