| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 | using System;using System.Collections;using System.Collections.Generic;using Google.ProtocolBuffers.Descriptors;namespace Google.ProtocolBuffers.Serialization{    /// <summary>    /// Allows writing messages to a name/value dictionary    /// </summary>    public class DictionaryWriter : AbstractWriter    {        private readonly IDictionary<string, object> _output;        /// <summary>        /// Constructs a writer using a new dictionary        /// </summary>        public DictionaryWriter()            : this(new Dictionary<string, object>(StringComparer.Ordinal))        {        }        /// <summary>        /// Constructs a writer using an existing dictionary        /// </summary>        public DictionaryWriter(IDictionary<string, object> output)        {            ThrowHelper.ThrowIfNull(output, "output");            _output = output;        }        /// <summary>        /// Creates the dictionary instance for a child message.        /// </summary>        protected virtual DictionaryWriter Create()        {            return new DictionaryWriter();        }        /// <summary>        /// Accesses the dictionary that is backing this writer        /// </summary>        public IDictionary<string, object> ToDictionary()        {            return _output;        }        /// <summary>        /// Writes the message to the the formatted stream.        /// </summary>        public override void WriteMessage(IMessageLite message)        {            message.WriteTo(this);        }        /// <summary>        /// Writes a Boolean value        /// </summary>        protected override void Write(string field, bool value)        {            _output[field] = value;        }        /// <summary>        /// Writes a Int32 value        /// </summary>        protected override void Write(string field, int value)        {            _output[field] = value;        }        /// <summary>        /// Writes a UInt32 value        /// </summary>        [CLSCompliant(false)]        protected override void Write(string field, uint value)        {            _output[field] = value;        }        /// <summary>        /// Writes a Int64 value        /// </summary>        protected override void Write(string field, long value)        {            _output[field] = value;        }        /// <summary>        /// Writes a UInt64 value        /// </summary>        [CLSCompliant(false)]        protected override void Write(string field, ulong value)        {            _output[field] = value;        }        /// <summary>        /// Writes a Single value        /// </summary>        protected override void Write(string field, float value)        {            _output[field] = value;        }        /// <summary>        /// Writes a Double value        /// </summary>        protected override void Write(string field, double value)        {            _output[field] = value;        }        /// <summary>        /// Writes a String value        /// </summary>        protected override void Write(string field, string value)        {            _output[field] = value;        }        /// <summary>        /// Writes a set of bytes        /// </summary>        protected override void Write(string field, ByteString value)        {            _output[field] = value.ToByteArray();        }        /// <summary>        /// Writes a message or group as a field        /// </summary>        protected override void WriteMessageOrGroup(string field, IMessageLite message)        {            DictionaryWriter writer = Create();            writer.WriteMessage(message);            _output[field] = writer.ToDictionary();        }        /// <summary>        /// Writes a System.Enum by the numeric and textual value        /// </summary>        protected override void WriteEnum(string field, int number, string name)        {            _output[field] = number;        }        /// <summary>        /// Writes an array of field values        /// </summary>        protected override void WriteArray(FieldType fieldType, string field, IEnumerable items)        {            List<object> objects = new List<object>();            foreach (object o in items)            {                switch (fieldType)                {                    case FieldType.Group:                    case FieldType.Message:                        {                            DictionaryWriter writer = Create();                            writer.WriteMessage((IMessageLite) o);                            objects.Add(writer.ToDictionary());                        }                        break;                    case FieldType.Bytes:                        objects.Add(((ByteString) o).ToByteArray());                        break;                    case FieldType.Enum:                        if (o is IEnumLite)                        {                            objects.Add(((IEnumLite) o).Number);                        }                        else                        {                            objects.Add((int) o);                        }                        break;                    default:                        objects.Add(o);                        break;                }            }            _output[field] = objects.ToArray();        }    }}
 |