示例#1
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken token;
            bool         writePacked = WritePacked;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken(); // default
            }
            bool checkForNull = !SupportNull;

            foreach (object subItem in (IEnumerable)value)
            {
                if (checkForNull && subItem == null)
                {
                    throw new NullReferenceException();
                }
                Tail.Write(subItem, dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#2
0
        public override void Write(object value, ProtoWriter dest)
        {
            IList        list  = (IList)value;
            int          count = list.Count;
            bool         flag  = (options & 1) != 0;
            SubItemToken token;

            if (flag)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = default(SubItemToken);
            }
            bool flag2 = !SupportNull;

            for (int i = 0; i < count; i++)
            {
                object obj = list[i];
                if (flag2 && obj == null)
                {
                    throw new NullReferenceException();
                }
                base.Tail.Write(obj, dest);
            }
            if (flag)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#3
0
        public override void Write(object value, ProtoWriter dest)
        {
            IList        arr = (IList)value;
            int          len = arr.Count;
            SubItemToken token;
            bool         writePacked = (options & OPTIONS_WritePacked) != 0;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken(); // default
            }
            bool checkForNull = !SupportNull;

            for (int i = 0; i < len; i++)
            {
                object obj = arr[i];
                if (checkForNull && obj == null)
                {
                    throw new NullReferenceException();
                }
                Tail.Write(obj, dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#4
0
        public override void Write(object value, ProtoWriter dest)
        {
            bool         writePacked = WritePacked;
            SubItemToken token;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = default(SubItemToken);
            }
            bool flag = !SupportNull;

            foreach (object item in (IEnumerable)value)
            {
                if (flag && item == null)
                {
                    throw new NullReferenceException();
                }
                base.Tail.Write(item, dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#5
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken subItemToken;
            bool         writePacked = this.WritePacked;

            if (!writePacked)
            {
                subItemToken = new SubItemToken();
            }
            else
            {
                ProtoWriter.WriteFieldHeader(this.fieldNumber, WireType.String, dest);
                subItemToken = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(this.fieldNumber, dest);
            }
            bool supportNull = !this.SupportNull;

            foreach (object obj in (IEnumerable)value)
            {
                if (supportNull && obj == null)
                {
                    throw new NullReferenceException();
                }
                this.Tail.Write(obj, dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(subItemToken, dest);
            }
        }
示例#6
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken token;
            bool         writePacked = this.WritePacked;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(this.fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(this.fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken();
            }
            bool flag2 = !this.SupportNull;

            foreach (object obj2 in (IEnumerable)value)
            {
                if (flag2 && (obj2 == null))
                {
                    throw new NullReferenceException();
                }
                base.Tail.Write(obj2, dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#7
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken subItemToken;
            IList        lists = (IList)value;
            int          count = lists.Count;
            bool         flag  = (this.options & 1) != 0;

            if (!flag)
            {
                subItemToken = new SubItemToken();
            }
            else
            {
                ProtoWriter.WriteFieldHeader(this.fieldNumber, WireType.String, dest);
                subItemToken = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(this.fieldNumber, dest);
            }
            bool supportNull = !this.SupportNull;

            for (int i = 0; i < count; i++)
            {
                object item = lists[i];
                if (supportNull && item == null)
                {
                    throw new NullReferenceException();
                }
                this.Tail.Write(item, dest);
            }
            if (flag)
            {
                ProtoWriter.EndSubItem(subItemToken, dest);
            }
        }
示例#8
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken token;
            bool         writePacked = WritePacked;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken(); // default
            }
            bool checkForNull = !SupportNull;

            // TODO-GC:对于值类型的列表,这里严重GC
            // 1)GeGetEnumerator产生GC40B
            // 2)每次GetCurrent产生GC20B
            foreach (object subItem in (IEnumerable)value)
            {
                if (checkForNull && subItem == null)
                {
                    throw new NullReferenceException();
                }
                Tail.Write(ValueObject.TryGet(subItem), dest);
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
示例#9
0
        public override void Write(ProtoWriter dest, ref ProtoWriter.State state, object value)
        {
            IList        arr = (IList)value;
            int          len = arr.Count;
            SubItemToken token;
            bool         writePacked       = (options & OPTIONS_WritePacked) != 0;
            bool         fixedLengthPacked = writePacked && CanUsePackedPrefix();

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest, ref state);

                if (fixedLengthPacked)
                {
                    ProtoWriter.WritePackedPrefix(arr.Count, packedWireType, dest, ref state);
                    token = new SubItemToken(); // default
                }
                else
                {
                    token = ProtoWriter.StartSubItem(value, dest, ref state);
                }
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken(); // default
            }
            bool checkForNull = !SupportNull;

            for (int i = 0; i < len; i++)
            {
                object obj = arr[i];
                if (checkForNull && obj == null)
                {
                    throw new NullReferenceException();
                }
                Tail.Write(dest, ref state, obj);
            }
            if (writePacked)
            {
                if (fixedLengthPacked)
                {
                    ProtoWriter.ClearPackedField(fieldNumber, dest);
                }
                else
                {
                    ProtoWriter.EndSubItem(token, dest, ref state);
                }
            }
        }
示例#10
0
        public override void Write(object value, ProtoWriter dest)
        {
            SubItemToken token;
            bool         writePacked     = WritePacked;
            bool         fixedSizePacked = writePacked & CanUsePackedPrefix(value) && value is ICollection;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);
                if (fixedSizePacked)
                {
                    ProtoWriter.WritePackedPrefix(((ICollection)value).Count, packedWireType, dest);
                    token = default(SubItemToken);
                }
                else
                {
                    token = ProtoWriter.StartSubItem(value, dest);
                }
                ProtoWriter.SetPackedField(fieldNumber, dest);
            }
            else
            {
                token = new SubItemToken(); // default
            }
            bool checkForNull = !SupportNull;

            foreach (object subItem in (IEnumerable)value)
            {
                if (checkForNull && subItem == null)
                {
                    throw new NullReferenceException();
                }
                Tail.Write(subItem, dest);
            }
            if (writePacked)
            {
                if (fixedSizePacked)
                {
                    ProtoWriter.ClearPackedField(fieldNumber, dest);
                }
                else
                {
                    ProtoWriter.EndSubItem(token, dest);
                }
            }
        }
示例#11
0
        public override void Write(object value, ProtoWriter dest)
        {
            bool         writePacked = this.WritePacked;
            SubItemToken token;

            if (writePacked)
            {
                ProtoWriter.WriteFieldHeader(this.fieldNumber, WireType.String, dest);
                token = ProtoWriter.StartSubItem(value, dest);
                ProtoWriter.SetPackedField(this.fieldNumber, dest);
            }
            else
            {
                token = default(SubItemToken);
            }
            bool        flag       = !this.SupportNull;
            IEnumerator enumerator = ((IEnumerable)value).GetEnumerator();

            try
            {
                while (enumerator.MoveNext())
                {
                    object current = enumerator.get_Current();
                    if (flag && current == null)
                    {
                        throw new NullReferenceException();
                    }
                    this.Tail.Write(current, dest);
                }
            }
            finally
            {
                IDisposable disposable = enumerator as IDisposable;
                if (disposable != null)
                {
                    disposable.Dispose();
                }
            }
            if (writePacked)
            {
                ProtoWriter.EndSubItem(token, dest);
            }
        }
        public void AddChannel(Channel channel)
        {
            ProtoWriter.WriteFieldHeader(2, WireType.StartGroup, writer);
            var channelTok = ProtoWriter.StartSubItem(null, writer);

            if (channel.Name != null)
            {
                ProtoWriter.WriteFieldHeader(1, WireType.String, writer);
                ProtoWriter.WriteString(channel.Name, writer);
            }
            var list = channel.Points;

            if (list != null)
            {
                switch (list.Count)
                {
                case 0:
                    // nothing to write
                    break;

                case 1:
                    ProtoWriter.WriteFieldHeader(2, WireType.Fixed32, writer);
                    ProtoWriter.WriteSingle(list[0], writer);
                    break;

                default:
                    ProtoWriter.WriteFieldHeader(2, WireType.String, writer);
                    var dataToken = ProtoWriter.StartSubItem(null, writer);
                    ProtoWriter.SetPackedField(2, writer);
                    foreach (var val in list)
                    {
                        ProtoWriter.WriteFieldHeader(2, WireType.Fixed32, writer);
                        ProtoWriter.WriteSingle(val, writer);
                    }
                    ProtoWriter.EndSubItem(dataToken, writer);
                    break;
                }
            }
            ProtoWriter.EndSubItem(channelTok, writer);
        }
示例#13
0
        public override void Write(object value, ProtoWriter dest)
        {
            IList arr = (IList)value;
            int   len = arr.Count;

            if (packedFieldNumber > 0)
            {
                if (len != 0)
                {
                    ProtoWriter.WriteFieldHeader(packedFieldNumber, WireType.String, dest);
                    SubItemToken token = ProtoWriter.StartSubItem(value, dest);
                    ProtoWriter.SetPackedField(packedFieldNumber, dest);
                    for (int i = 0; i < len; i++)
                    {
                        object obj = arr[i];
                        if (obj == null)
                        {
                            throw new NullReferenceException();
                        }
                        Tail.Write(obj, dest);
                    }
                    ProtoWriter.EndSubItem(token, dest);
                }
            }
            else
            {
                for (int i = 0; i < len; i++)
                {
                    object obj = arr[i];
                    if (obj == null)
                    {
                        throw new NullReferenceException();
                    }
                    Tail.Write(obj, dest);
                }
            }
        }
示例#14
0
 public override void Write(object value, ProtoWriter dest)
 {
     if (packedFieldNumber > 0)
     {
         IEnumerator iter = ((IEnumerable)value).GetEnumerator();
         using (iter as IDisposable)
         {
             if (iter.MoveNext())
             {
                 ProtoWriter.WriteFieldHeader(packedFieldNumber, WireType.String, dest);
                 SubItemToken token = ProtoWriter.StartSubItem(value, dest);
                 ProtoWriter.SetPackedField(packedFieldNumber, dest);
                 do
                 {
                     object subItem = iter.Current;
                     if (subItem == null)
                     {
                         throw new NullReferenceException();
                     }
                     Tail.Write(subItem, dest);
                 } while (iter.MoveNext());
                 ProtoWriter.EndSubItem(token, dest);
             }
         }
     }
     else
     {
         foreach (object subItem in (IEnumerable)value)
         {
             if (subItem == null)
             {
                 throw new NullReferenceException();
             }
             Tail.Write(subItem, dest);
         }
     }
 }