public override void Write(object value, ProtoWriter dest)
        {
            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);

                if (fixedLengthPacked)
                {
                    ProtoWriter.WritePackedPrefix(arr.Count, packedWireType, dest);
                    token = new SubItemToken(); // default
                }
                else
                {
                    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)
            {
                if (fixedLengthPacked)
                {
                    ProtoWriter.ClearPackedField(fieldNumber, dest);
                }
                else
                {
                    ProtoWriter.EndSubItem(token, dest);
                }
            }
        }
Beispiel #2
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);
                }
            }
        }