SerializableTest.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #if !NOSERIALIZABLE
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.Hosting;
  6. using System.Runtime.Serialization;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8. using System.Text;
  9. using Google.ProtocolBuffers.TestProtos;
  10. using Microsoft.VisualStudio.TestTools.UnitTesting;
  11. namespace Google.ProtocolBuffers
  12. {
  13. [TestClass]
  14. public class SerializableTest
  15. {
  16. /// <summary>
  17. /// Just keep it from even compiling if we these objects don't implement the expected interface.
  18. /// </summary>
  19. public static readonly ISerializable CompileTimeCheckSerializableMessage = TestXmlMessage.DefaultInstance;
  20. public static readonly ISerializable CompileTimeCheckSerializableBuilder = new TestXmlMessage.Builder();
  21. [TestMethod]
  22. [Ignore] // Serialization hasn't been reimplemented yet
  23. public void TestPlainMessage()
  24. {
  25. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  26. .SetValid(true)
  27. .SetText("text")
  28. .AddTextlines("a")
  29. .AddTextlines("b")
  30. .AddTextlines("c")
  31. .SetNumber(0x1010101010)
  32. .AddNumbers(1)
  33. .AddNumbers(2)
  34. .AddNumbers(3)
  35. .SetChild(TestXmlChild.CreateBuilder()
  36. .AddOptions(EnumOptions.ONE)
  37. .SetBinary(ByteString.CopyFrom(new byte[1])))
  38. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  39. .AddOptions(EnumOptions.TWO)
  40. .SetBinary(ByteString.CopyFrom(new byte[2])))
  41. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  42. .AddOptions(EnumOptions.THREE)
  43. .SetBinary(ByteString.CopyFrom(new byte[3])))
  44. .Build();
  45. MemoryStream ms = new MemoryStream();
  46. new BinaryFormatter().Serialize(ms, message);
  47. ms.Position = 0;
  48. TestXmlMessage copy = (TestXmlMessage)new BinaryFormatter().Deserialize(ms);
  49. Assert.AreEqual(message, copy);
  50. }
  51. [TestMethod]
  52. [Ignore] // Serialization hasn't been reimplemented yet
  53. public void TestMessageWithExtensions()
  54. {
  55. TestXmlMessage message = TestXmlMessage.CreateBuilder()
  56. .SetValid(true)
  57. .SetText("text")
  58. .AddTextlines("a")
  59. .AddTextlines("b")
  60. .AddTextlines("c")
  61. .SetNumber(0x1010101010)
  62. .AddNumbers(1)
  63. .AddNumbers(2)
  64. .AddNumbers(3)
  65. .SetChild(TestXmlChild.CreateBuilder()
  66. .AddOptions(EnumOptions.ONE)
  67. .SetBinary(ByteString.CopyFrom(new byte[1])))
  68. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  69. .AddOptions(EnumOptions.TWO)
  70. .SetBinary(ByteString.CopyFrom(new byte[2])))
  71. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  72. .AddOptions(EnumOptions.THREE)
  73. .SetBinary(ByteString.CopyFrom(new byte[3])))
  74. .SetExtension(UnittestExtrasXmltest.ExtensionText, " extension text value ! ")
  75. .SetExtension(UnittestExtrasXmltest.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
  76. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 100)
  77. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 101)
  78. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 102)
  79. .SetExtension(UnittestExtrasXmltest.ExtensionEnum, EnumOptions.ONE)
  80. .Build();
  81. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  82. UnittestExtrasXmltest.RegisterAllExtensions(registry);
  83. MemoryStream ms = new MemoryStream();
  84. new BinaryFormatter().Serialize(ms, message);
  85. ms.Position = 0;
  86. //you need to provide the extension registry as context to the serializer
  87. BinaryFormatter bff = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.All, registry));
  88. TestXmlMessage copy = (TestXmlMessage)bff.Deserialize(ms);
  89. // And all extensions will be defined.
  90. Assert.AreEqual(message, copy);
  91. }
  92. [TestMethod]
  93. [Ignore] // Serialization hasn't been reimplemented yet
  94. public void TestPlainBuilder()
  95. {
  96. TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder()
  97. .SetValid(true)
  98. .SetText("text")
  99. .AddTextlines("a")
  100. .AddTextlines("b")
  101. .AddTextlines("c")
  102. .SetNumber(0x1010101010)
  103. .AddNumbers(1)
  104. .AddNumbers(2)
  105. .AddNumbers(3)
  106. .SetChild(TestXmlChild.CreateBuilder()
  107. .AddOptions(EnumOptions.ONE)
  108. .SetBinary(ByteString.CopyFrom(new byte[1])))
  109. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  110. .AddOptions(EnumOptions.TWO)
  111. .SetBinary(ByteString.CopyFrom(new byte[2])))
  112. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  113. .AddOptions(EnumOptions.THREE)
  114. .SetBinary(ByteString.CopyFrom(new byte[3])))
  115. ;
  116. MemoryStream ms = new MemoryStream();
  117. new BinaryFormatter().Serialize(ms, builder);
  118. ms.Position = 0;
  119. TestXmlMessage.Builder copy = (TestXmlMessage.Builder)new BinaryFormatter().Deserialize(ms);
  120. Assert.AreEqual(builder.Build(), copy.Build());
  121. }
  122. [TestMethod]
  123. [Ignore] // Serialization hasn't been reimplemented yet
  124. public void TestBuilderWithExtensions()
  125. {
  126. TestXmlMessage.Builder builder = TestXmlMessage.CreateBuilder()
  127. .SetValid(true)
  128. .SetText("text")
  129. .AddTextlines("a")
  130. .AddTextlines("b")
  131. .AddTextlines("c")
  132. .SetNumber(0x1010101010)
  133. .AddNumbers(1)
  134. .AddNumbers(2)
  135. .AddNumbers(3)
  136. .SetChild(TestXmlChild.CreateBuilder()
  137. .AddOptions(EnumOptions.ONE)
  138. .SetBinary(ByteString.CopyFrom(new byte[1])))
  139. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  140. .AddOptions(EnumOptions.TWO)
  141. .SetBinary(ByteString.CopyFrom(new byte[2])))
  142. .AddChildren(TestXmlMessage.Types.Children.CreateBuilder()
  143. .AddOptions(EnumOptions.THREE)
  144. .SetBinary(ByteString.CopyFrom(new byte[3])))
  145. .SetExtension(UnittestExtrasXmltest.ExtensionText, " extension text value ! ")
  146. .SetExtension(UnittestExtrasXmltest.ExtensionMessage, new TestXmlExtension.Builder().SetNumber(42).Build())
  147. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 100)
  148. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 101)
  149. .AddExtension(UnittestExtrasXmltest.ExtensionNumber, 102)
  150. .SetExtension(UnittestExtrasXmltest.ExtensionEnum, EnumOptions.ONE)
  151. ;
  152. ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
  153. UnittestExtrasXmltest.RegisterAllExtensions(registry);
  154. MemoryStream ms = new MemoryStream();
  155. new BinaryFormatter().Serialize(ms, builder);
  156. ms.Position = 0;
  157. //you need to provide the extension registry as context to the serializer
  158. BinaryFormatter bff = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.All, registry));
  159. TestXmlMessage.Builder copy = (TestXmlMessage.Builder)bff.Deserialize(ms);
  160. // And all extensions will be defined.
  161. Assert.AreEqual(builder.Build(), copy.Build());
  162. }
  163. }
  164. }
  165. #endif