AbstractWriter.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Globalization;
  5. using Google.ProtocolBuffers.Descriptors;
  6. //Disable CS3011: only CLS-compliant members can be abstract
  7. #pragma warning disable 3011
  8. namespace Google.ProtocolBuffers.Serialization
  9. {
  10. /// <summary>
  11. /// Provides a base class for writers that performs some basic type dispatching
  12. /// </summary>
  13. public abstract class AbstractWriter : ICodedOutputStream
  14. {
  15. /// <summary>
  16. /// Completes any pending write operations
  17. /// </summary>
  18. public virtual void Flush()
  19. {
  20. }
  21. /// <summary>
  22. /// Writes the message to the the formatted stream.
  23. /// </summary>
  24. public abstract void WriteMessage(IMessageLite message);
  25. /// <summary>
  26. /// Used to write any nessary root-message preamble. After this call you can call
  27. /// IMessageLite.MergeTo(...) and complete the message with a call to WriteMessageEnd().
  28. /// These three calls are identical to just calling WriteMessage(message);
  29. /// </summary>
  30. /// <example>
  31. /// AbstractWriter writer;
  32. /// writer.WriteMessageStart();
  33. /// message.WriteTo(writer);
  34. /// writer.WriteMessageEnd();
  35. /// // ... or, but not both ...
  36. /// writer.WriteMessage(message);
  37. /// </example>
  38. public abstract void WriteMessageStart();
  39. /// <summary>
  40. /// Used to complete a root-message previously started with a call to WriteMessageStart()
  41. /// </summary>
  42. public abstract void WriteMessageEnd();
  43. /// <summary>
  44. /// Writes a Boolean value
  45. /// </summary>
  46. protected abstract void Write(string field, Boolean value);
  47. /// <summary>
  48. /// Writes a Int32 value
  49. /// </summary>
  50. protected abstract void Write(string field, Int32 value);
  51. /// <summary>
  52. /// Writes a UInt32 value
  53. /// </summary>
  54. protected abstract void Write(string field, UInt32 value);
  55. /// <summary>
  56. /// Writes a Int64 value
  57. /// </summary>
  58. protected abstract void Write(string field, Int64 value);
  59. /// <summary>
  60. /// Writes a UInt64 value
  61. /// </summary>
  62. protected abstract void Write(string field, UInt64 value);
  63. /// <summary>
  64. /// Writes a Single value
  65. /// </summary>
  66. protected abstract void Write(string field, Single value);
  67. /// <summary>
  68. /// Writes a Double value
  69. /// </summary>
  70. protected abstract void Write(string field, Double value);
  71. /// <summary>
  72. /// Writes a String value
  73. /// </summary>
  74. protected abstract void Write(string field, String value);
  75. /// <summary>
  76. /// Writes a set of bytes
  77. /// </summary>
  78. protected abstract void Write(string field, ByteString value);
  79. /// <summary>
  80. /// Writes a message or group as a field
  81. /// </summary>
  82. protected abstract void WriteMessageOrGroup(string field, IMessageLite message);
  83. /// <summary>
  84. /// Writes a System.Enum by the numeric and textual value
  85. /// </summary>
  86. protected abstract void WriteEnum(string field, int number, string name);
  87. /// <summary>
  88. /// Writes a field of the type determined by field.FieldType
  89. /// </summary>
  90. protected virtual void WriteField(FieldType fieldType, string field, object value)
  91. {
  92. switch (fieldType)
  93. {
  94. case FieldType.Bool:
  95. Write(field, (bool) value);
  96. break;
  97. case FieldType.Int64:
  98. case FieldType.SInt64:
  99. case FieldType.SFixed64:
  100. Write(field, (long) value);
  101. break;
  102. case FieldType.UInt64:
  103. case FieldType.Fixed64:
  104. Write(field, (ulong) value);
  105. break;
  106. case FieldType.Int32:
  107. case FieldType.SInt32:
  108. case FieldType.SFixed32:
  109. Write(field, (int) value);
  110. break;
  111. case FieldType.UInt32:
  112. case FieldType.Fixed32:
  113. Write(field, (uint) value);
  114. break;
  115. case FieldType.Float:
  116. Write(field, (float) value);
  117. break;
  118. case FieldType.Double:
  119. Write(field, (double) value);
  120. break;
  121. case FieldType.String:
  122. Write(field, (string) value);
  123. break;
  124. case FieldType.Bytes:
  125. Write(field, (ByteString) value);
  126. break;
  127. case FieldType.Group:
  128. WriteMessageOrGroup(field, (IMessageLite) value);
  129. break;
  130. case FieldType.Message:
  131. WriteMessageOrGroup(field, (IMessageLite) value);
  132. break;
  133. case FieldType.Enum:
  134. {
  135. if (value is IEnumLite)
  136. {
  137. WriteEnum(field, ((IEnumLite) value).Number, ((IEnumLite) value).Name);
  138. }
  139. else if (value is IConvertible)
  140. {
  141. WriteEnum(field, ((IConvertible)value).ToInt32(FrameworkPortability.InvariantCulture),
  142. ((IConvertible)value).ToString(FrameworkPortability.InvariantCulture));
  143. }
  144. else
  145. {
  146. throw new ArgumentException("Expected an Enum type for field " + field);
  147. }
  148. break;
  149. }
  150. default:
  151. throw InvalidProtocolBufferException.InvalidTag();
  152. }
  153. }
  154. /// <summary>
  155. /// Writes an array of field values
  156. /// </summary>
  157. protected virtual void WriteArray(FieldType fieldType, string field, IEnumerable items)
  158. {
  159. foreach (object obj in items)
  160. {
  161. WriteField(fieldType, field, obj);
  162. }
  163. }
  164. /// <summary>
  165. /// Writes a numeric unknown field of wire type: Fixed32, Fixed64, or Variant
  166. /// </summary>
  167. protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ulong value)
  168. {
  169. }
  170. /// <summary>
  171. /// Writes an unknown field, Expect WireType of GroupStart or LengthPrefix
  172. /// </summary>
  173. protected virtual void WriteUnknown(WireFormat.WireType wireType, int fieldNumber, ByteString value)
  174. {
  175. }
  176. #region ICodedOutputStream Members
  177. void ICodedOutputStream.WriteUnknownGroup(int fieldNumber, IMessageLite value)
  178. {
  179. }
  180. void ICodedOutputStream.WriteUnknownBytes(int fieldNumber, ByteString value)
  181. {
  182. }
  183. void ICodedOutputStream.WriteUnknownField(int fieldNumber, WireFormat.WireType type, ulong value)
  184. {
  185. }
  186. void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, IMessageLite value)
  187. {
  188. }
  189. void ICodedOutputStream.WriteMessageSetExtension(int fieldNumber, string fieldName, ByteString value)
  190. {
  191. }
  192. void ICodedOutputStream.WriteField(FieldType fieldType, int fieldNumber, string fieldName, object value)
  193. {
  194. WriteField(fieldType, fieldName, value);
  195. }
  196. void ICodedOutputStream.WriteDouble(int fieldNumber, string fieldName, double value)
  197. {
  198. Write(fieldName, value);
  199. }
  200. void ICodedOutputStream.WriteFloat(int fieldNumber, string fieldName, float value)
  201. {
  202. Write(fieldName, value);
  203. }
  204. void ICodedOutputStream.WriteUInt64(int fieldNumber, string fieldName, ulong value)
  205. {
  206. Write(fieldName, value);
  207. }
  208. void ICodedOutputStream.WriteInt64(int fieldNumber, string fieldName, long value)
  209. {
  210. Write(fieldName, value);
  211. }
  212. void ICodedOutputStream.WriteInt32(int fieldNumber, string fieldName, int value)
  213. {
  214. Write(fieldName, value);
  215. }
  216. void ICodedOutputStream.WriteFixed64(int fieldNumber, string fieldName, ulong value)
  217. {
  218. Write(fieldName, value);
  219. }
  220. void ICodedOutputStream.WriteFixed32(int fieldNumber, string fieldName, uint value)
  221. {
  222. Write(fieldName, value);
  223. }
  224. void ICodedOutputStream.WriteBool(int fieldNumber, string fieldName, bool value)
  225. {
  226. Write(fieldName, value);
  227. }
  228. void ICodedOutputStream.WriteString(int fieldNumber, string fieldName, string value)
  229. {
  230. Write(fieldName, value);
  231. }
  232. void ICodedOutputStream.WriteGroup(int fieldNumber, string fieldName, IMessageLite value)
  233. {
  234. WriteMessageOrGroup(fieldName, value);
  235. }
  236. void ICodedOutputStream.WriteMessage(int fieldNumber, string fieldName, IMessageLite value)
  237. {
  238. WriteMessageOrGroup(fieldName, value);
  239. }
  240. void ICodedOutputStream.WriteBytes(int fieldNumber, string fieldName, ByteString value)
  241. {
  242. Write(fieldName, value);
  243. }
  244. void ICodedOutputStream.WriteUInt32(int fieldNumber, string fieldName, uint value)
  245. {
  246. Write(fieldName, value);
  247. }
  248. void ICodedOutputStream.WriteEnum(int fieldNumber, string fieldName, int value, object rawValue)
  249. {
  250. WriteEnum(fieldName, value, rawValue.ToString());
  251. }
  252. void ICodedOutputStream.WriteSFixed32(int fieldNumber, string fieldName, int value)
  253. {
  254. Write(fieldName, value);
  255. }
  256. void ICodedOutputStream.WriteSFixed64(int fieldNumber, string fieldName, long value)
  257. {
  258. Write(fieldName, value);
  259. }
  260. void ICodedOutputStream.WriteSInt32(int fieldNumber, string fieldName, int value)
  261. {
  262. Write(fieldName, value);
  263. }
  264. void ICodedOutputStream.WriteSInt64(int fieldNumber, string fieldName, long value)
  265. {
  266. Write(fieldName, value);
  267. }
  268. void ICodedOutputStream.WriteArray(FieldType fieldType, int fieldNumber, string fieldName, IEnumerable list)
  269. {
  270. WriteArray(fieldType, fieldName, list);
  271. }
  272. void ICodedOutputStream.WriteGroupArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
  273. {
  274. WriteArray(FieldType.Group, fieldName, list);
  275. }
  276. void ICodedOutputStream.WriteMessageArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
  277. {
  278. WriteArray(FieldType.Message, fieldName, list);
  279. }
  280. void ICodedOutputStream.WriteStringArray(int fieldNumber, string fieldName, IEnumerable<string> list)
  281. {
  282. WriteArray(FieldType.String, fieldName, list);
  283. }
  284. void ICodedOutputStream.WriteBytesArray(int fieldNumber, string fieldName, IEnumerable<ByteString> list)
  285. {
  286. WriteArray(FieldType.Bytes, fieldName, list);
  287. }
  288. void ICodedOutputStream.WriteBoolArray(int fieldNumber, string fieldName, IEnumerable<bool> list)
  289. {
  290. WriteArray(FieldType.Bool, fieldName, list);
  291. }
  292. void ICodedOutputStream.WriteInt32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
  293. {
  294. WriteArray(FieldType.Int32, fieldName, list);
  295. }
  296. void ICodedOutputStream.WriteSInt32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
  297. {
  298. WriteArray(FieldType.SInt32, fieldName, list);
  299. }
  300. void ICodedOutputStream.WriteUInt32Array(int fieldNumber, string fieldName, IEnumerable<uint> list)
  301. {
  302. WriteArray(FieldType.UInt32, fieldName, list);
  303. }
  304. void ICodedOutputStream.WriteFixed32Array(int fieldNumber, string fieldName, IEnumerable<uint> list)
  305. {
  306. WriteArray(FieldType.Fixed32, fieldName, list);
  307. }
  308. void ICodedOutputStream.WriteSFixed32Array(int fieldNumber, string fieldName, IEnumerable<int> list)
  309. {
  310. WriteArray(FieldType.SFixed32, fieldName, list);
  311. }
  312. void ICodedOutputStream.WriteInt64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
  313. {
  314. WriteArray(FieldType.Int64, fieldName, list);
  315. }
  316. void ICodedOutputStream.WriteSInt64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
  317. {
  318. WriteArray(FieldType.SInt64, fieldName, list);
  319. }
  320. void ICodedOutputStream.WriteUInt64Array(int fieldNumber, string fieldName, IEnumerable<ulong> list)
  321. {
  322. WriteArray(FieldType.UInt64, fieldName, list);
  323. }
  324. void ICodedOutputStream.WriteFixed64Array(int fieldNumber, string fieldName, IEnumerable<ulong> list)
  325. {
  326. WriteArray(FieldType.Fixed64, fieldName, list);
  327. }
  328. void ICodedOutputStream.WriteSFixed64Array(int fieldNumber, string fieldName, IEnumerable<long> list)
  329. {
  330. WriteArray(FieldType.SFixed64, fieldName, list);
  331. }
  332. void ICodedOutputStream.WriteDoubleArray(int fieldNumber, string fieldName, IEnumerable<double> list)
  333. {
  334. WriteArray(FieldType.Double, fieldName, list);
  335. }
  336. void ICodedOutputStream.WriteFloatArray(int fieldNumber, string fieldName, IEnumerable<float> list)
  337. {
  338. WriteArray(FieldType.Float, fieldName, list);
  339. }
  340. void ICodedOutputStream.WriteEnumArray<T>(int fieldNumber, string fieldName, IEnumerable<T> list)
  341. {
  342. WriteArray(FieldType.Enum, fieldName, list);
  343. }
  344. void ICodedOutputStream.WritePackedArray(FieldType fieldType, int fieldNumber, string fieldName,
  345. IEnumerable list)
  346. {
  347. WriteArray(fieldType, fieldName, list);
  348. }
  349. void ICodedOutputStream.WritePackedBoolArray(int fieldNumber, string fieldName, int computedSize,
  350. IEnumerable<bool> list)
  351. {
  352. WriteArray(FieldType.Bool, fieldName, list);
  353. }
  354. void ICodedOutputStream.WritePackedInt32Array(int fieldNumber, string fieldName, int computedSize,
  355. IEnumerable<int> list)
  356. {
  357. WriteArray(FieldType.Int32, fieldName, list);
  358. }
  359. void ICodedOutputStream.WritePackedSInt32Array(int fieldNumber, string fieldName, int computedSize,
  360. IEnumerable<int> list)
  361. {
  362. WriteArray(FieldType.SInt32, fieldName, list);
  363. }
  364. void ICodedOutputStream.WritePackedUInt32Array(int fieldNumber, string fieldName, int computedSize,
  365. IEnumerable<uint> list)
  366. {
  367. WriteArray(FieldType.UInt32, fieldName, list);
  368. }
  369. void ICodedOutputStream.WritePackedFixed32Array(int fieldNumber, string fieldName, int computedSize,
  370. IEnumerable<uint> list)
  371. {
  372. WriteArray(FieldType.Fixed32, fieldName, list);
  373. }
  374. void ICodedOutputStream.WritePackedSFixed32Array(int fieldNumber, string fieldName, int computedSize,
  375. IEnumerable<int> list)
  376. {
  377. WriteArray(FieldType.SFixed32, fieldName, list);
  378. }
  379. void ICodedOutputStream.WritePackedInt64Array(int fieldNumber, string fieldName, int computedSize,
  380. IEnumerable<long> list)
  381. {
  382. WriteArray(FieldType.Int64, fieldName, list);
  383. }
  384. void ICodedOutputStream.WritePackedSInt64Array(int fieldNumber, string fieldName, int computedSize,
  385. IEnumerable<long> list)
  386. {
  387. WriteArray(FieldType.SInt64, fieldName, list);
  388. }
  389. void ICodedOutputStream.WritePackedUInt64Array(int fieldNumber, string fieldName, int computedSize,
  390. IEnumerable<ulong> list)
  391. {
  392. WriteArray(FieldType.UInt64, fieldName, list);
  393. }
  394. void ICodedOutputStream.WritePackedFixed64Array(int fieldNumber, string fieldName, int computedSize,
  395. IEnumerable<ulong> list)
  396. {
  397. WriteArray(FieldType.Fixed64, fieldName, list);
  398. }
  399. void ICodedOutputStream.WritePackedSFixed64Array(int fieldNumber, string fieldName, int computedSize,
  400. IEnumerable<long> list)
  401. {
  402. WriteArray(FieldType.SFixed64, fieldName, list);
  403. }
  404. void ICodedOutputStream.WritePackedDoubleArray(int fieldNumber, string fieldName, int computedSize,
  405. IEnumerable<double> list)
  406. {
  407. WriteArray(FieldType.Double, fieldName, list);
  408. }
  409. void ICodedOutputStream.WritePackedFloatArray(int fieldNumber, string fieldName, int computedSize,
  410. IEnumerable<float> list)
  411. {
  412. WriteArray(FieldType.Float, fieldName, list);
  413. }
  414. void ICodedOutputStream.WritePackedEnumArray<T>(int fieldNumber, string fieldName, int computedSize,
  415. IEnumerable<T> list)
  416. {
  417. WriteArray(FieldType.Enum, fieldName, list);
  418. }
  419. #endregion
  420. }
  421. }