DictionaryWriter.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Google.ProtocolBuffers.Descriptors;
  5. namespace Google.ProtocolBuffers.Serialization
  6. {
  7. /// <summary>
  8. /// Allows writing messages to a name/value dictionary
  9. /// </summary>
  10. public class DictionaryWriter : AbstractWriter
  11. {
  12. private readonly IDictionary<string, object> _output;
  13. /// <summary>
  14. /// Constructs a writer using a new dictionary
  15. /// </summary>
  16. public DictionaryWriter()
  17. : this(new Dictionary<string, object>(StringComparer.Ordinal))
  18. {
  19. }
  20. /// <summary>
  21. /// Constructs a writer using an existing dictionary
  22. /// </summary>
  23. public DictionaryWriter(IDictionary<string, object> output)
  24. {
  25. ThrowHelper.ThrowIfNull(output, "output");
  26. _output = output;
  27. }
  28. /// <summary>
  29. /// Creates the dictionary instance for a child message.
  30. /// </summary>
  31. protected virtual DictionaryWriter Create()
  32. {
  33. return new DictionaryWriter();
  34. }
  35. /// <summary>
  36. /// Accesses the dictionary that is backing this writer
  37. /// </summary>
  38. public IDictionary<string, object> ToDictionary()
  39. {
  40. return _output;
  41. }
  42. /// <summary>
  43. /// Writes the message to the the formatted stream.
  44. /// </summary>
  45. public override void WriteMessage(IMessageLite message)
  46. {
  47. message.WriteTo(this);
  48. }
  49. /// <summary>
  50. /// Writes a Boolean value
  51. /// </summary>
  52. protected override void Write(string field, bool value)
  53. {
  54. _output[field] = value;
  55. }
  56. /// <summary>
  57. /// Writes a Int32 value
  58. /// </summary>
  59. protected override void Write(string field, int value)
  60. {
  61. _output[field] = value;
  62. }
  63. /// <summary>
  64. /// Writes a UInt32 value
  65. /// </summary>
  66. [CLSCompliant(false)]
  67. protected override void Write(string field, uint value)
  68. {
  69. _output[field] = value;
  70. }
  71. /// <summary>
  72. /// Writes a Int64 value
  73. /// </summary>
  74. protected override void Write(string field, long value)
  75. {
  76. _output[field] = value;
  77. }
  78. /// <summary>
  79. /// Writes a UInt64 value
  80. /// </summary>
  81. [CLSCompliant(false)]
  82. protected override void Write(string field, ulong value)
  83. {
  84. _output[field] = value;
  85. }
  86. /// <summary>
  87. /// Writes a Single value
  88. /// </summary>
  89. protected override void Write(string field, float value)
  90. {
  91. _output[field] = value;
  92. }
  93. /// <summary>
  94. /// Writes a Double value
  95. /// </summary>
  96. protected override void Write(string field, double value)
  97. {
  98. _output[field] = value;
  99. }
  100. /// <summary>
  101. /// Writes a String value
  102. /// </summary>
  103. protected override void Write(string field, string value)
  104. {
  105. _output[field] = value;
  106. }
  107. /// <summary>
  108. /// Writes a set of bytes
  109. /// </summary>
  110. protected override void Write(string field, ByteString value)
  111. {
  112. _output[field] = value.ToByteArray();
  113. }
  114. /// <summary>
  115. /// Writes a message or group as a field
  116. /// </summary>
  117. protected override void WriteMessageOrGroup(string field, IMessageLite message)
  118. {
  119. DictionaryWriter writer = Create();
  120. writer.WriteMessage(message);
  121. _output[field] = writer.ToDictionary();
  122. }
  123. /// <summary>
  124. /// Writes a System.Enum by the numeric and textual value
  125. /// </summary>
  126. protected override void WriteEnum(string field, int number, string name)
  127. {
  128. _output[field] = number;
  129. }
  130. /// <summary>
  131. /// Writes an array of field values
  132. /// </summary>
  133. protected override void WriteArray(FieldType fieldType, string field, IEnumerable items)
  134. {
  135. List<object> objects = new List<object>();
  136. foreach (object o in items)
  137. {
  138. switch (fieldType)
  139. {
  140. case FieldType.Group:
  141. case FieldType.Message:
  142. {
  143. DictionaryWriter writer = Create();
  144. writer.WriteMessage((IMessageLite) o);
  145. objects.Add(writer.ToDictionary());
  146. }
  147. break;
  148. case FieldType.Bytes:
  149. objects.Add(((ByteString) o).ToByteArray());
  150. break;
  151. case FieldType.Enum:
  152. if (o is IEnumLite)
  153. {
  154. objects.Add(((IEnumLite) o).Number);
  155. }
  156. else
  157. {
  158. objects.Add((int) o);
  159. }
  160. break;
  161. default:
  162. objects.Add(o);
  163. break;
  164. }
  165. }
  166. _output[field] = objects.ToArray();
  167. }
  168. }
  169. }