2 // DataContractJsonSerializerTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
6 // Ankit Jain <JAnkit@novell.com>
7 // Antoine Cailliau <antoinecailliau@gmail.com>
9 // Copyright (C) 2005-2007 Novell, Inc. http://www.novell.com
12 // Permission is hereby granted, free of charge, to any person obtaining
13 // a copy of this software and associated documentation files (the
14 // "Software"), to deal in the Software without restriction, including
15 // without limitation the rights to use, copy, modify, merge, publish,
16 // distribute, sublicense, and/or sell copies of the Software, and to
17 // permit persons to whom the Software is furnished to do so, subject to
18 // the following conditions:
20 // The above copyright notice and this permission notice shall be
21 // included in all copies or substantial portions of the Software.
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 // This test code contains tests for DataContractJsonSerializer, which is
34 // imported from DataContractSerializerTest.cs.
38 using System.Collections;
39 using System.Collections.Generic;
40 using System.Collections.ObjectModel;
43 using System.Runtime.Serialization;
44 using System.Runtime.Serialization.Json;
47 using NUnit.Framework;
49 namespace MonoTests.System.Runtime.Serialization.Json
52 public class DataContractJsonSerializerTest
54 static readonly XmlWriterSettings settings;
56 static DataContractJsonSerializerTest ()
58 settings = new XmlWriterSettings ();
59 settings.OmitXmlDeclaration = true;
66 public string Member1;
70 [ExpectedException (typeof (ArgumentNullException))]
71 public void ConstructorTypeNull ()
73 new DataContractJsonSerializer (null);
77 public void ConstructorKnownTypesNull ()
79 // null knownTypes is allowed.
80 new DataContractJsonSerializer (typeof (Sample1), (IEnumerable<Type>) null);
81 new DataContractJsonSerializer (typeof (Sample1), "Foo", null);
85 [ExpectedException (typeof (ArgumentNullException))]
86 public void ConstructorNameNull ()
88 new DataContractJsonSerializer (typeof (Sample1), (string) null);
92 [ExpectedException (typeof (ArgumentOutOfRangeException))]
93 public void ConstructorNegativeMaxObjects ()
95 new DataContractJsonSerializer (typeof (Sample1), "Sample1",
96 null, -1, false, null, false);
100 public void ConstructorMisc ()
102 new DataContractJsonSerializer (typeof (GlobalSample1)).WriteObject (new MemoryStream (), new GlobalSample1 ());
106 public void WriteObjectContent ()
108 StringWriter sw = new StringWriter ();
109 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
110 DataContractJsonSerializer ser =
111 new DataContractJsonSerializer (typeof (string));
112 xw.WriteStartElement ("my-element");
113 ser.WriteObjectContent (xw, "TEST STRING");
114 xw.WriteEndElement ();
116 Assert.AreEqual ("<my-element>TEST STRING</my-element>",
123 public void SerializeIntXml ()
125 StringWriter sw = new StringWriter ();
126 SerializeInt (XmlWriter.Create (sw, settings));
128 @"<root type=""number"">1</root>",
133 public void SerializeIntJson ()
135 MemoryStream ms = new MemoryStream ();
136 SerializeInt (JsonReaderWriterFactory.CreateJsonWriter (ms));
139 Encoding.UTF8.GetString (ms.ToArray ()));
142 void SerializeInt (XmlWriter writer)
144 DataContractJsonSerializer ser =
145 new DataContractJsonSerializer (typeof (int));
146 using (XmlWriter w = writer) {
147 ser.WriteObject (w, 1);
151 // int, with rootName
154 public void SerializeIntXmlWithRootName ()
156 StringWriter sw = new StringWriter ();
157 SerializeIntWithRootName (XmlWriter.Create (sw, settings));
159 @"<myroot type=""number"">1</myroot>",
164 // since JsonWriter supports only "root" as the root name, using
165 // XmlWriter from JsonReaderWriterFactory will always fail with
166 // an explicit rootName.
167 [ExpectedException (typeof (SerializationException))]
168 public void SerializeIntJsonWithRootName ()
170 MemoryStream ms = new MemoryStream ();
171 SerializeIntWithRootName (JsonReaderWriterFactory.CreateJsonWriter (ms));
174 Encoding.UTF8.GetString (ms.ToArray ()));
177 void SerializeIntWithRootName (XmlWriter writer)
179 DataContractJsonSerializer ser =
180 new DataContractJsonSerializer (typeof (int), "myroot");
181 using (XmlWriter w = writer) {
182 ser.WriteObject (w, 1);
186 // pass typeof(DCEmpty), serialize int
189 public void SerializeIntForDCEmptyXml ()
191 StringWriter sw = new StringWriter ();
192 SerializeIntForDCEmpty (XmlWriter.Create (sw, settings));
194 @"<root type=""number"">1</root>",
199 public void SerializeIntForDCEmptyJson ()
201 MemoryStream ms = new MemoryStream ();
202 SerializeIntForDCEmpty (JsonReaderWriterFactory.CreateJsonWriter (ms));
205 Encoding.UTF8.GetString (ms.ToArray ()));
208 void SerializeIntForDCEmpty (XmlWriter writer)
210 DataContractJsonSerializer ser =
211 new DataContractJsonSerializer (typeof (DCEmpty));
212 using (XmlWriter w = writer) {
213 ser.WriteObject (w, 1);
220 public void SerializeEmptyClassXml ()
222 StringWriter sw = new StringWriter ();
223 SerializeEmptyClass (XmlWriter.Create (sw, settings));
225 @"<root type=""object"" />",
230 public void SerializeEmptyClassJson ()
232 MemoryStream ms = new MemoryStream ();
233 SerializeEmptyClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
236 Encoding.UTF8.GetString (ms.ToArray ()));
239 void SerializeEmptyClass (XmlWriter writer)
241 DataContractJsonSerializer ser =
242 new DataContractJsonSerializer (typeof (DCEmpty));
243 using (XmlWriter w = writer) {
244 ser.WriteObject (w, new DCEmpty ());
248 // string (primitive)
251 public void SerializePrimitiveStringXml ()
253 StringWriter sw = new StringWriter ();
254 SerializePrimitiveString (XmlWriter.Create (sw, settings));
261 public void SerializePrimitiveStringJson ()
263 MemoryStream ms = new MemoryStream ();
264 SerializePrimitiveString (JsonReaderWriterFactory.CreateJsonWriter (ms));
267 Encoding.UTF8.GetString (ms.ToArray ()));
270 void SerializePrimitiveString (XmlWriter writer)
272 XmlObjectSerializer ser =
273 new DataContractJsonSerializer (typeof (string));
274 using (XmlWriter w = writer) {
275 ser.WriteObject (w, "TEST");
279 // QName (primitive but ...)
282 public void SerializePrimitiveQNameXml ()
284 StringWriter sw = new StringWriter ();
285 SerializePrimitiveQName (XmlWriter.Create (sw, settings));
287 "<root>foo:urn:foo</root>",
292 public void SerializePrimitiveQNameJson ()
294 MemoryStream ms = new MemoryStream ();
295 SerializePrimitiveQName (JsonReaderWriterFactory.CreateJsonWriter (ms));
298 Encoding.UTF8.GetString (ms.ToArray ()));
301 void SerializePrimitiveQName (XmlWriter writer)
303 XmlObjectSerializer ser =
304 new DataContractJsonSerializer (typeof (XmlQualifiedName));
305 using (XmlWriter w = writer) {
306 ser.WriteObject (w, new XmlQualifiedName ("foo", "urn:foo"));
310 // DBNull (primitive)
313 public void SerializeDBNullXml ()
315 StringWriter sw = new StringWriter ();
316 SerializeDBNull (XmlWriter.Create (sw, settings));
318 @"<root type=""object"" />",
323 public void SerializeDBNullJson ()
325 MemoryStream ms = new MemoryStream ();
326 SerializeDBNull (JsonReaderWriterFactory.CreateJsonWriter (ms));
329 Encoding.UTF8.GetString (ms.ToArray ()));
332 void SerializeDBNull (XmlWriter writer)
334 DataContractJsonSerializer ser =
335 new DataContractJsonSerializer (typeof (DBNull));
336 using (XmlWriter w = writer) {
337 ser.WriteObject (w, DBNull.Value);
344 public void SerializeSimpleClass1Xml ()
346 StringWriter sw = new StringWriter ();
347 SerializeSimpleClass1 (XmlWriter.Create (sw, settings));
349 @"<root type=""object""><Foo>TEST</Foo></root>",
354 public void SerializeSimpleClass1Json ()
356 MemoryStream ms = new MemoryStream ();
357 SerializeSimpleClass1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
359 @"{""Foo"":""TEST""}",
360 Encoding.UTF8.GetString (ms.ToArray ()));
363 void SerializeSimpleClass1 (XmlWriter writer)
365 DataContractJsonSerializer ser =
366 new DataContractJsonSerializer (typeof (DCSimple1));
367 using (XmlWriter w = writer) {
368 ser.WriteObject (w, new DCSimple1 ());
375 // NonDC is not a DataContract type.
376 public void SerializeNonDCOnlyCtor ()
378 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
382 //[ExpectedException (typeof (InvalidDataContractException))]
383 // NonDC is not a DataContract type.
384 // UPDATE: non-DataContract types are became valid in RTM.
385 public void SerializeNonDC ()
387 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (NonDC));
388 using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
389 ser.WriteObject (w, new NonDC ());
396 //[ExpectedException (typeof (InvalidDataContractException))]
397 // DCHasNonDC itself is a DataContract type whose field is
398 // marked as DataMember but its type is not DataContract.
399 // UPDATE: non-DataContract types are became valid in RTM.
400 public void SerializeDCHasNonDC ()
402 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasNonDC));
403 using (XmlWriter w = XmlWriter.Create (TextWriter.Null, settings)) {
404 ser.WriteObject (w, new DCHasNonDC ());
411 public void SerializeSimpleSerializable1Xml ()
413 StringWriter sw = new StringWriter ();
414 SerializeSimpleSerializable1 (XmlWriter.Create (sw, settings));
416 @"<root type=""object""><Ser type=""object""><Doh>doh!</Doh></Ser></root>",
421 public void SerializeSimpleSerializable1Json ()
423 MemoryStream ms = new MemoryStream ();
424 SerializeSimpleSerializable1 (JsonReaderWriterFactory.CreateJsonWriter (ms));
426 @"{""Ser"":{""Doh"":""doh!""}}",
427 Encoding.UTF8.GetString (ms.ToArray ()));
430 // DCHasSerializable itself is DataContract and has a field
431 // whose type is not contract but serializable.
432 void SerializeSimpleSerializable1 (XmlWriter writer)
434 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCHasSerializable));
435 using (XmlWriter w = writer) {
436 ser.WriteObject (w, new DCHasSerializable ());
441 public void SerializeDCWithNameXml ()
443 StringWriter sw = new StringWriter ();
444 SerializeDCWithName (XmlWriter.Create (sw, settings));
446 @"<root type=""object""><FooMember>value</FooMember></root>",
451 public void SerializeDCWithNameJson ()
453 MemoryStream ms = new MemoryStream ();
454 SerializeDCWithName (JsonReaderWriterFactory.CreateJsonWriter (ms));
456 @"{""FooMember"":""value""}",
457 Encoding.UTF8.GetString (ms.ToArray ()));
460 void SerializeDCWithName (XmlWriter writer)
462 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
463 using (XmlWriter w = writer) {
464 ser.WriteObject (w, new DCWithName ());
469 public void SerializeDCWithEmptyName1 ()
471 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyName));
472 StringWriter sw = new StringWriter ();
473 DCWithEmptyName dc = new DCWithEmptyName ();
474 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
476 ser.WriteObject (w, dc);
477 } catch (InvalidDataContractException) {
481 Assert.Fail ("Expected InvalidDataContractException");
485 public void SerializeDCWithEmptyName2 ()
487 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithName));
488 StringWriter sw = new StringWriter ();
490 /* DataContractAttribute.Name == "", not valid */
491 DCWithEmptyName dc = new DCWithEmptyName ();
492 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
494 ser.WriteObject (w, dc);
495 } catch (InvalidDataContractException) {
499 Assert.Fail ("Expected InvalidDataContractException");
503 [Category("NotWorking")]
504 public void SerializeDCWithNullName ()
506 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithNullName));
507 StringWriter sw = new StringWriter ();
508 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
510 /* DataContractAttribute.Name == "", not valid */
511 ser.WriteObject (w, new DCWithNullName ());
512 } catch (InvalidDataContractException) {
516 Assert.Fail ("Expected InvalidDataContractException");
520 public void SerializeDCWithEmptyNamespace1 ()
522 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEmptyNamespace));
523 StringWriter sw = new StringWriter ();
524 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
525 ser.WriteObject (w, new DCWithEmptyNamespace ());
530 public void SerializeWrappedClassXml ()
532 StringWriter sw = new StringWriter ();
533 SerializeWrappedClass (XmlWriter.Create (sw, settings));
535 @"<root type=""object"" />",
540 public void SerializeWrappedClassJson ()
542 MemoryStream ms = new MemoryStream ();
543 SerializeWrappedClass (JsonReaderWriterFactory.CreateJsonWriter (ms));
546 Encoding.UTF8.GetString (ms.ToArray ()));
549 void SerializeWrappedClass (XmlWriter writer)
551 DataContractJsonSerializer ser =
552 new DataContractJsonSerializer (typeof (Wrapper.DCWrapped));
553 using (XmlWriter w = writer) {
554 ser.WriteObject (w, new Wrapper.DCWrapped ());
558 // CollectionContainer : Items must have a setter. (but became valid in RTM).
560 public void SerializeReadOnlyCollectionMember ()
562 DataContractJsonSerializer ser =
563 new DataContractJsonSerializer (typeof (CollectionContainer));
564 StringWriter sw = new StringWriter ();
565 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
566 ser.WriteObject (w, null);
570 // DataCollectionContainer : Items must have a setter. (but became valid in RTM).
572 public void SerializeReadOnlyDataCollectionMember ()
574 DataContractJsonSerializer ser =
575 new DataContractJsonSerializer (typeof (DataCollectionContainer));
576 StringWriter sw = new StringWriter ();
577 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
578 ser.WriteObject (w, null);
583 [Ignore ("https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=409970")]
584 [ExpectedException (typeof (SerializationException))]
585 public void DeserializeReadOnlyDataCollection_NullCollection ()
587 DataContractJsonSerializer ser =
588 new DataContractJsonSerializer (typeof (CollectionContainer));
589 StringWriter sw = new StringWriter ();
590 var c = new CollectionContainer ();
593 using (XmlWriter w = XmlWriter.Create (sw, settings))
594 ser.WriteObject (w, c);
595 // CollectionContainer.Items is null, so it cannot deserialize non-null collection.
596 using (XmlReader r = XmlReader.Create (new StringReader (sw.ToString ())))
597 c = (CollectionContainer) ser.ReadObject (r);
601 public void SerializeGuidXml ()
603 StringWriter sw = new StringWriter ();
604 SerializeGuid (XmlWriter.Create (sw, settings));
606 @"<root>00000000-0000-0000-0000-000000000000</root>",
611 public void SerializeGuidJson ()
613 MemoryStream ms = new MemoryStream ();
614 SerializeGuid (JsonReaderWriterFactory.CreateJsonWriter (ms));
616 @"""00000000-0000-0000-0000-000000000000""",
617 Encoding.UTF8.GetString (ms.ToArray ()));
620 void SerializeGuid (XmlWriter writer)
622 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Guid));
623 using (XmlWriter w = writer) {
624 ser.WriteObject (w, Guid.Empty);
629 public void SerializeEnumXml ()
631 StringWriter sw = new StringWriter ();
632 SerializeEnum (XmlWriter.Create (sw, settings));
634 @"<root type=""number"">0</root>",
639 public void SerializeEnumJson ()
641 MemoryStream ms = new MemoryStream ();
642 SerializeEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
645 Encoding.UTF8.GetString (ms.ToArray ()));
648 void SerializeEnum (XmlWriter writer)
650 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
651 using (XmlWriter w = writer) {
652 ser.WriteObject (w, new Colors ());
657 public void SerializeEnum2Xml ()
659 StringWriter sw = new StringWriter ();
660 SerializeEnum2 (XmlWriter.Create (sw, settings));
662 @"<root type=""number"">0</root>",
667 public void SerializeEnum2Json ()
669 MemoryStream ms = new MemoryStream ();
670 SerializeEnum2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
673 Encoding.UTF8.GetString (ms.ToArray ()));
676 void SerializeEnum2 (XmlWriter writer)
678 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (Colors));
679 using (XmlWriter w = writer) {
680 ser.WriteObject (w, 0);
684 [Test] // so, DataContract does not affect here.
685 public void SerializeEnumWithDCXml ()
687 StringWriter sw = new StringWriter ();
688 SerializeEnumWithDC (XmlWriter.Create (sw, settings));
690 @"<root type=""number"">0</root>",
695 public void SerializeEnumWithDCJson ()
697 MemoryStream ms = new MemoryStream ();
698 SerializeEnumWithDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
701 Encoding.UTF8.GetString (ms.ToArray ()));
704 void SerializeEnumWithDC (XmlWriter writer)
706 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
707 using (XmlWriter w = writer) {
708 ser.WriteObject (w, new ColorsWithDC ());
713 public void SerializeEnumWithNoDCXml ()
715 StringWriter sw = new StringWriter ();
716 SerializeEnumWithNoDC (XmlWriter.Create (sw, settings));
718 @"<root type=""number"">0</root>",
723 public void SerializeEnumWithNoDCJson ()
725 MemoryStream ms = new MemoryStream ();
726 SerializeEnumWithNoDC (JsonReaderWriterFactory.CreateJsonWriter (ms));
729 Encoding.UTF8.GetString (ms.ToArray ()));
732 void SerializeEnumWithNoDC (XmlWriter writer)
734 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsEnumMemberNoDC));
735 using (XmlWriter w = writer) {
736 ser.WriteObject (w, new ColorsEnumMemberNoDC ());
741 public void SerializeEnumWithDC2Xml ()
743 StringWriter sw = new StringWriter ();
744 SerializeEnumWithDC2 (XmlWriter.Create (sw, settings));
746 @"<root type=""number"">3</root>",
751 public void SerializeEnumWithDC2Json ()
753 MemoryStream ms = new MemoryStream ();
754 SerializeEnumWithDC2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
757 Encoding.UTF8.GetString (ms.ToArray ()));
760 void SerializeEnumWithDC2 (XmlWriter writer)
762 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
763 using (XmlWriter w = writer) {
764 ser.WriteObject (w, 3);
770 [ExpectedException (typeof (SerializationException))]
771 public void SerializeEnumWithDCInvalid ()
773 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (ColorsWithDC));
774 StringWriter sw = new StringWriter ();
775 ColorsWithDC cdc = ColorsWithDC.Blue;
776 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
777 ser.WriteObject (w, cdc);
783 public void SerializeDCWithEnumXml ()
785 StringWriter sw = new StringWriter ();
786 SerializeDCWithEnum (XmlWriter.Create (sw, settings));
788 @"<root type=""object""><_colors type=""number"">0</_colors></root>",
793 public void SerializeDCWithEnumJson ()
795 MemoryStream ms = new MemoryStream ();
796 SerializeDCWithEnum (JsonReaderWriterFactory.CreateJsonWriter (ms));
799 Encoding.UTF8.GetString (ms.ToArray ()));
802 void SerializeDCWithEnum (XmlWriter writer)
804 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum));
805 using (XmlWriter w = writer) {
806 ser.WriteObject (w, new DCWithEnum ());
811 public void SerializerDCArrayXml ()
813 StringWriter sw = new StringWriter ();
814 SerializerDCArray (XmlWriter.Create (sw, settings));
816 @"<root type=""array""><item type=""object""><_colors type=""number"">0</_colors></item><item type=""object""><_colors type=""number"">1</_colors></item></root>",
821 public void SerializerDCArrayJson ()
823 MemoryStream ms = new MemoryStream ();
824 SerializerDCArray (JsonReaderWriterFactory.CreateJsonWriter (ms));
826 @"[{""_colors"":0},{""_colors"":1}]",
827 Encoding.UTF8.GetString (ms.ToArray ()));
830 void SerializerDCArray (XmlWriter writer)
832 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (DCWithEnum []));
833 DCWithEnum [] arr = new DCWithEnum [2];
834 arr [0] = new DCWithEnum (); arr [0].colors = Colors.Red;
835 arr [1] = new DCWithEnum (); arr [1].colors = Colors.Green;
836 using (XmlWriter w = writer) {
837 ser.WriteObject (w, arr);
842 public void SerializerDCArray2Xml ()
844 StringWriter sw = new StringWriter ();
845 SerializerDCArray2 (XmlWriter.Create (sw, settings));
847 @"<root type=""array""><item __type=""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><_colors type=""number"">0</_colors></item><item __type=""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"" type=""object""><Foo>hello</Foo></item></root>",
852 public void SerializerDCArray2Json ()
854 MemoryStream ms = new MemoryStream ();
855 SerializerDCArray2 (JsonReaderWriterFactory.CreateJsonWriter (ms));
857 @"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
858 Encoding.UTF8.GetString (ms.ToArray ()));
861 void SerializerDCArray2 (XmlWriter writer)
863 List<Type> known = new List<Type> ();
864 known.Add (typeof (DCWithEnum));
865 known.Add (typeof (DCSimple1));
866 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (object []), known);
867 object [] arr = new object [2];
868 arr [0] = new DCWithEnum (); ((DCWithEnum)arr [0]).colors = Colors.Red;
869 arr [1] = new DCSimple1 (); ((DCSimple1) arr [1]).Foo = "hello";
871 using (XmlWriter w = writer) {
872 ser.WriteObject (w, arr);
877 public void SerializerDCArray3Xml ()
879 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
880 StringWriter sw = new StringWriter ();
881 int [] arr = new int [2];
882 arr [0] = 1; arr [1] = 2;
884 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
885 ser.WriteObject (w, arr);
889 @"<root type=""array""><item type=""number"">1</item><item type=""number"">2</item></root>",
894 public void SerializerDCArray3Json ()
896 MemoryStream ms = new MemoryStream ();
897 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (int []));
898 int [] arr = new int [2];
899 arr [0] = 1; arr [1] = 2;
901 using (XmlWriter w = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
902 ser.WriteObject (w, arr);
907 Encoding.UTF8.GetString (ms.ToArray ()));
911 // ... so, non-JSON XmlWriter is still accepted.
912 public void SerializeNonDCArrayXml ()
914 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
915 StringWriter sw = new StringWriter ();
916 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
917 ser.WriteObject (xw, new SerializeNonDCArrayType ());
919 Assert.AreEqual (@"<root type=""object""><IPAddresses type=""array"" /></root>",
924 public void SerializeNonDCArrayJson ()
926 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
927 MemoryStream ms = new MemoryStream ();
928 using (XmlWriter xw = JsonReaderWriterFactory.CreateJsonWriter (ms)) {
929 ser.WriteObject (xw, new SerializeNonDCArrayType ());
931 Assert.AreEqual (@"{""IPAddresses"":[]}",
932 Encoding.UTF8.GetString (ms.ToArray ()));
936 public void SerializeNonDCArrayItems ()
938 DataContractJsonSerializer ser = new DataContractJsonSerializer (typeof (SerializeNonDCArrayType));
939 StringWriter sw = new StringWriter ();
940 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
941 SerializeNonDCArrayType obj = new SerializeNonDCArrayType ();
942 obj.IPAddresses = new NonDCItem [] {new NonDCItem () { Data = new byte [] {1, 2, 3, 4} } };
943 ser.WriteObject (xw, obj);
946 XmlDocument doc = new XmlDocument ();
947 doc.LoadXml (sw.ToString ());
948 XmlNamespaceManager nsmgr = new XmlNamespaceManager (doc.NameTable);
949 nsmgr.AddNamespace ("s", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
950 nsmgr.AddNamespace ("n", "http://schemas.datacontract.org/2004/07/System.Net");
951 nsmgr.AddNamespace ("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
953 Assert.AreEqual (1, doc.SelectNodes ("/root/IPAddresses/item", nsmgr).Count, "#1");
954 XmlElement el = doc.SelectSingleNode ("/root/IPAddresses/item/Data", nsmgr) as XmlElement;
955 Assert.IsNotNull (el, "#3");
956 Assert.AreEqual (4, el.SelectNodes ("item", nsmgr).Count, "#4");
960 public void MaxItemsInObjectGraph1 ()
962 // object count == maximum
963 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCEmpty), null, 1, false, null, false);
964 s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCEmpty ());
968 [ExpectedException (typeof (SerializationException))]
969 public void MaxItemsInObjectGraph2 ()
971 // object count > maximum
972 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1), null, 1, false, null, false);
973 s.WriteObject (XmlWriter.Create (TextWriter.Null), new DCSimple1 ());
977 public void DeserializeString ()
979 Assert.AreEqual ("ABC", Deserialize ("\"ABC\"", typeof (string)));
983 public void DeserializeInt ()
985 Assert.AreEqual (5, Deserialize ("5", typeof (int)));
989 public void DeserializeArray ()
991 int [] ret = (int []) Deserialize ("[5,6,7]", typeof (int []));
992 Assert.AreEqual (5, ret [0], "#1");
993 Assert.AreEqual (6, ret [1], "#2");
994 Assert.AreEqual (7, ret [2], "#3");
998 public void DeserializeArrayUntyped ()
1000 object [] ret = (object []) Deserialize ("[5,6,7]", typeof (object []));
1001 Assert.AreEqual (5, ret [0], "#1");
1002 Assert.AreEqual (6, ret [1], "#2");
1003 Assert.AreEqual (7, ret [2], "#3");
1007 public void DeserializeMixedArray ()
1009 object [] ret = (object []) Deserialize ("[5,\"6\",false]", typeof (object []));
1010 Assert.AreEqual (5, ret [0], "#1");
1011 Assert.AreEqual ("6", ret [1], "#2");
1012 Assert.AreEqual (false, ret [2], "#3");
1016 [ExpectedException (typeof (SerializationException))]
1017 public void DeserializeEmptyAsString ()
1019 // it somehow expects "root" which should have been already consumed.
1020 Deserialize ("", typeof (string));
1024 [ExpectedException (typeof (SerializationException))]
1025 public void DeserializeEmptyAsInt ()
1027 // it somehow expects "root" which should have been already consumed.
1028 Deserialize ("", typeof (int));
1032 [ExpectedException (typeof (SerializationException))]
1033 public void DeserializeEmptyAsDBNull ()
1035 // it somehow expects "root" which should have been already consumed.
1036 Deserialize ("", typeof (DBNull));
1040 public void DeserializeEmptyObjectAsString ()
1042 // looks like it is converted to ""
1043 Assert.AreEqual (String.Empty, Deserialize ("{}", typeof (string)));
1047 [ExpectedException (typeof (SerializationException))]
1048 public void DeserializeEmptyObjectAsInt ()
1050 Deserialize ("{}", typeof (int));
1054 public void DeserializeEmptyObjectAsDBNull ()
1056 Assert.AreEqual (DBNull.Value, Deserialize ("{}", typeof (DBNull)));
1060 [ExpectedException (typeof (SerializationException))]
1061 public void DeserializeEnumByName ()
1063 // enum is parsed into long
1064 Deserialize (@"""Red""", typeof (Colors));
1068 public void DeserializeEnum2 ()
1070 object o = Deserialize ("0", typeof (Colors));
1072 Assert.AreEqual (typeof (Colors), o.GetType (), "#de3");
1073 Colors c = (Colors) o;
1074 Assert.AreEqual (Colors.Red, c, "#de4");
1078 [ExpectedException (typeof (SerializationException))]
1079 public void DeserializeEnumInvalid ()
1081 Deserialize ("", typeof (Colors));
1085 [ExpectedException (typeof (SerializationException))]
1086 [Category ("NotDotNet")] // 0.0 is an invalid Colors value.
1087 public void DeserializeEnumInvalid3 ()
1089 //"0.0" instead of "0"
1096 public void DeserializeEnumWithDC ()
1098 object o = Deserialize ("0", typeof (ColorsWithDC));
1100 Assert.AreEqual (typeof (ColorsWithDC), o.GetType (), "#de5");
1101 ColorsWithDC cdc = (ColorsWithDC) o;
1102 Assert.AreEqual (ColorsWithDC.Red, o, "#de6");
1106 [ExpectedException (typeof (SerializationException))]
1107 [Category ("NotDotNet")] // 4 is an invalid Colors value.
1108 [Category ("NotWorking")]
1109 public void DeserializeEnumWithDCInvalid ()
1113 typeof (ColorsWithDC));
1117 public void DeserializeDCWithEnum ()
1119 object o = Deserialize (
1121 typeof (DCWithEnum));
1123 Assert.AreEqual (typeof (DCWithEnum), o.GetType (), "#de7");
1124 DCWithEnum dc = (DCWithEnum) o;
1125 Assert.AreEqual (Colors.Red, dc.colors, "#de8");
1129 public void ReadObjectVerifyObjectNameFalse ()
1131 string xml = @"<any><Member1>bar</Member1></any>";
1132 object o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1133 .ReadObject (XmlReader.Create (new StringReader (xml)), false);
1134 Assert.IsTrue (o is VerifyObjectNameTestData, "#1");
1136 string xml2 = @"<any><x:Member1 xmlns:x=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">bar</x:Member1></any>";
1137 o = new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1138 .ReadObject (XmlReader.Create (new StringReader (xml2)), false);
1139 Assert.IsTrue (o is VerifyObjectNameTestData, "#2");
1143 [ExpectedException (typeof (SerializationException))]
1144 public void ReadObjectVerifyObjectNameTrue ()
1146 string xml = @"<any><Member1>bar</Member1></any>";
1147 new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1148 .ReadObject (XmlReader.Create (new StringReader (xml)), true);
1151 [Test] // member name is out of scope
1152 public void ReadObjectVerifyObjectNameTrue2 ()
1154 string xml = @"<root><Member2>bar</Member2></root>";
1155 new DataContractJsonSerializer (typeof (VerifyObjectNameTestData))
1156 .ReadObject (XmlReader.Create (new StringReader (xml)), true);
1160 public void ReadTypedObjectJson ()
1162 object o = Deserialize (@"{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}", typeof (DCWithEnum));
1163 Assert.AreEqual (typeof (DCWithEnum), o.GetType ());
1167 public void ReadObjectDCArrayJson ()
1169 object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}]",
1170 typeof (object []), typeof (DCWithEnum));
1171 Assert.AreEqual (typeof (object []), o.GetType (), "#1");
1172 object [] arr = (object []) o;
1173 Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
1177 public void ReadObjectDCArray2Json ()
1179 object o = Deserialize (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0},{""__type"":""DCSimple1:#MonoTests.System.Runtime.Serialization.Json"",""Foo"":""hello""}]",
1180 typeof (object []), typeof (DCWithEnum), typeof (DCSimple1));
1181 Assert.AreEqual (typeof (object []), o.GetType (), "#1");
1182 object [] arr = (object []) o;
1183 Assert.AreEqual (typeof (DCWithEnum), arr [0].GetType (), "#2");
1184 Assert.AreEqual (typeof (DCSimple1), arr [1].GetType (), "#3");
1187 private object Deserialize (string xml, Type type, params Type [] knownTypes)
1189 DataContractJsonSerializer ser = new DataContractJsonSerializer (type, knownTypes);
1190 XmlReader xr = JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (xml), new XmlDictionaryReaderQuotas ());
1191 return ser.ReadObject (xr);
1195 public void IsStartObject ()
1197 DataContractJsonSerializer s = new DataContractJsonSerializer (typeof (DCSimple1));
1198 Assert.IsTrue (s.IsStartObject (XmlReader.Create (new StringReader ("<root></root>"))), "#1");
1199 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<dummy></dummy>"))), "#2");
1200 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<Foo></Foo>"))), "#3");
1201 Assert.IsFalse (s.IsStartObject (XmlReader.Create (new StringReader ("<root xmlns='urn:foo'></root>"))), "#4");
1205 public void SerializeNonDC2 ()
1207 var ser = new DataContractJsonSerializer (typeof (TestData));
1208 StringWriter sw = new StringWriter ();
1209 var obj = new TestData () { Foo = "foo", Bar = "bar", Baz = "baz" };
1212 using (var xw = XmlWriter.Create (sw))
1213 ser.WriteObject (xw, obj);
1214 var s = sw.ToString ();
1215 // since the order is not preserved, we compare only contents.
1216 Assert.IsTrue (s.IndexOf ("<Foo>foo</Foo>") > 0, "#1-1");
1217 Assert.IsTrue (s.IndexOf ("<Bar>bar</Bar>") > 0, "#1-2");
1218 Assert.IsFalse (s.IndexOf ("<Baz>baz</Baz>") > 0, "#1-3");
1221 MemoryStream ms = new MemoryStream ();
1222 using (var xw = JsonReaderWriterFactory.CreateJsonWriter (ms))
1223 ser.WriteObject (ms, obj);
1224 s = new StreamReader (new MemoryStream (ms.ToArray ())).ReadToEnd ().Replace ('"', '/');
1225 // since the order is not preserved, we compare only contents.
1226 Assert.IsTrue (s.IndexOf ("/Foo/:/foo/") > 0, "#2-1");
1227 Assert.IsTrue (s.IndexOf ("/Bar/:/bar/") > 0, "#2-2");
1228 Assert.IsFalse (s.IndexOf ("/Baz/:/baz/") > 0, "#2-3");
1232 public void AlwaysEmitTypeInformation ()
1234 var ms = new MemoryStream ();
1235 var ds = new DataContractJsonSerializer (typeof (string), "root", null, 10, false, null, true);
1236 ds.WriteObject (ms, "foobar");
1237 var s = Encoding.UTF8.GetString (ms.ToArray ());
1238 Assert.AreEqual ("\"foobar\"", s, "#1");
1242 public void AlwaysEmitTypeInformation2 ()
1244 var ms = new MemoryStream ();
1245 var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, true);
1246 ds.WriteObject (ms, new TestData () { Foo = "foo"});
1247 var s = Encoding.UTF8.GetString (ms.ToArray ());
1248 Assert.AreEqual (@"{""__type"":""TestData:#MonoTests.System.Runtime.Serialization.Json"",""Bar"":null,""Foo"":""foo""}", s, "#1");
1252 public void AlwaysEmitTypeInformation3 ()
1254 var ms = new MemoryStream ();
1255 var ds = new DataContractJsonSerializer (typeof (TestData), "root", null, 10, false, null, false);
1256 ds.WriteObject (ms, new TestData () { Foo = "foo"});
1257 var s = Encoding.UTF8.GetString (ms.ToArray ());
1258 Assert.AreEqual (@"{""Bar"":null,""Foo"":""foo""}", s, "#1");
1262 public void TestNonpublicDeserialization ()
1264 string s1= @"{""Bar"":""bar"", ""Foo"":""foo"", ""Baz"":""baz""}";
1265 TestData o1 = ((TestData)(new DataContractJsonSerializer (typeof (TestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s1), new XmlDictionaryReaderQuotas ()))));
1267 Assert.AreEqual (null, o1.Baz, "#1");
1269 string s2 = @"{""TestData"":[{""key"":""key1"",""value"":""value1""}]}";
1270 KeyValueTestData o2 = ((KeyValueTestData)(new DataContractJsonSerializer (typeof (KeyValueTestData)).ReadObject (JsonReaderWriterFactory.CreateJsonReader (Encoding.UTF8.GetBytes (s2), new XmlDictionaryReaderQuotas ()))));
1272 Assert.AreEqual (1, o2.TestData.Count, "#2");
1273 Assert.AreEqual ("key1", o2.TestData[0].Key, "#3");
1274 Assert.AreEqual ("value1", o2.TestData[0].Value, "#4");
1277 // [Test] use this case if you want to check lame silverlight parser behavior. Seealso #549756
1278 public void QuotelessDeserialization ()
1280 string s1 = @"{FooMember:""value""}";
1281 var ds = new DataContractJsonSerializer (typeof (DCWithName));
1282 ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s1)));
1284 string s2 = @"{FooMember:"" \""{dummy:string}\""""}";
1285 ds.ReadObject (new MemoryStream (Encoding.UTF8.GetBytes (s2)));
1289 [Category ("NotWorking")]
1290 public void TypeIsNotPartsOfKnownTypes ()
1292 var dcs = new DataContractSerializer (typeof (string));
1293 Assert.AreEqual (0, dcs.KnownTypes.Count, "KnownTypes #1");
1294 var dcjs = new DataContractJsonSerializer (typeof (string));
1295 Assert.AreEqual (0, dcjs.KnownTypes.Count, "KnownTypes #2");
1299 public void ReadWriteNullObject ()
1301 DataContractJsonSerializer dcjs = new DataContractJsonSerializer (typeof (string));
1302 using (MemoryStream ms = new MemoryStream ()) {
1303 dcjs.WriteObject (ms, null);
1305 using (StreamReader sr = new StreamReader (ms)) {
1306 string data = sr.ReadToEnd ();
1307 Assert.AreEqual ("null", data, "WriteObject(stream,null)");
1310 Assert.IsNull (dcjs.ReadObject (ms), "ReadObject(stream)");
1315 object ReadWriteObject (Type type, object obj, string expected)
1317 using (MemoryStream ms = new MemoryStream ()) {
1318 DataContractJsonSerializer dcjs = new DataContractJsonSerializer (type);
1319 dcjs.WriteObject (ms, obj);
1321 using (StreamReader sr = new StreamReader (ms)) {
1322 Assert.AreEqual (expected, sr.ReadToEnd (), "WriteObject");
1325 return dcjs.ReadObject (ms);
1331 [Ignore ("Wrong test case. See bug #573691")]
1332 public void ReadWriteObject_Single_SpecialCases ()
1334 Assert.IsTrue (Single.IsNaN ((float) ReadWriteObject (typeof (float), Single.NaN, "NaN")));
1335 Assert.IsTrue (Single.IsNegativeInfinity ((float) ReadWriteObject (typeof (float), Single.NegativeInfinity, "-INF")));
1336 Assert.IsTrue (Single.IsPositiveInfinity ((float) ReadWriteObject (typeof (float), Single.PositiveInfinity, "INF")));
1340 [Ignore ("Wrong test case. See bug #573691")]
1341 public void ReadWriteObject_Double_SpecialCases ()
1343 Assert.IsTrue (Double.IsNaN ((double) ReadWriteObject (typeof (double), Double.NaN, "NaN")));
1344 Assert.IsTrue (Double.IsNegativeInfinity ((double) ReadWriteObject (typeof (double), Double.NegativeInfinity, "-INF")));
1345 Assert.IsTrue (Double.IsPositiveInfinity ((double) ReadWriteObject (typeof (double), Double.PositiveInfinity, "INF")));
1349 public void ReadWriteDateTime ()
1351 var ms = new MemoryStream ();
1352 DataContractJsonSerializer serializer = new DataContractJsonSerializer (typeof (Query));
1353 Query query = new Query () {
1354 StartDate = new DateTime (2010, 3, 4, 5, 6, 7),
1355 EndDate = new DateTime (2010, 4, 5, 6, 7, 8)
1357 serializer.WriteObject (ms, query);
1358 Assert.AreEqual ("{\"StartDate\":\"\\/Date(1267679167000)\\/\",\"EndDate\":\"\\/Date(1270447628000)\\/\"}", Encoding.UTF8.GetString (ms.ToArray ()), "#1");
1360 Console.WriteLine (new StreamReader (ms).ReadToEnd ());
1362 var q = (Query) serializer.ReadObject(ms);
1363 Assert.AreEqual (query.StartDate, q.StartDate, "#2");
1364 Assert.AreEqual (query.EndDate, q.EndDate, "#3");
1367 [DataContract(Name = "DateTest")]
1368 public class DateTest
1370 [DataMember(Name = "should_have_value")]
1371 public DateTime? ShouldHaveValue { get; set; }
1375 // This tests both the extended format "number-0500" as well
1376 // as the nullable field in the structure
1378 public void BugXamarin163 ()
1380 string json = @"{""should_have_value"":""\/Date(1277355600000-0500)\/""}";
1382 byte[] bytes = global::System.Text.Encoding.UTF8.GetBytes(json);
1383 Stream inputStream = new MemoryStream(bytes);
1385 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
1386 DateTest t = serializer.ReadObject(inputStream) as DateTest;
1387 Assert.AreEqual (634129344000000000, t.ShouldHaveValue.Value.Ticks, "#1");
1391 public void NullableFieldsShouldSupportNullValue ()
1393 string json = @"{""should_have_value"":null}";
1394 var inputStream = new MemoryStream (Encoding.UTF8.GetBytes (json));
1395 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DateTest));
1396 Console.WriteLine ("# serializer assembly: {0}", serializer.GetType ().Assembly.Location);
1397 DateTest t = serializer.ReadObject (inputStream) as DateTest;
1398 Assert.AreEqual (false, t.ShouldHaveValue.HasValue, "#2");
1402 public void DeserializeNullMember ()
1404 var ds = new DataContractJsonSerializer (typeof (ClassA));
1405 var stream = new MemoryStream ();
1406 var a = new ClassA ();
1407 ds.WriteObject (stream, a);
1408 stream.Position = 0;
1409 a = (ClassA) ds.ReadObject (stream);
1410 Assert.IsNull (a.B, "#1");
1414 public void OnDeserializationMethods ()
1416 var ds = new DataContractJsonSerializer (typeof (GSPlayerListErg));
1417 var obj = new GSPlayerListErg ();
1418 var ms = new MemoryStream ();
1419 ds.WriteObject (ms, obj);
1422 Assert.IsTrue (GSPlayerListErg.A, "A");
1423 Assert.IsTrue (GSPlayerListErg.B, "B");
1424 Assert.IsTrue (GSPlayerListErg.C, "C");
1428 public void WriteChar ()
1430 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof (CharTest));
1431 using (MemoryStream ms = new MemoryStream()) {
1432 serializer.WriteObject(ms, new CharTest ());
1434 using (StreamReader reader = new StreamReader(ms)) {
1441 public void DictionarySerialization ()
1443 var dict = new MyDictionary<string,string> ();
1444 dict.Add ("key", "value");
1445 var serializer = new DataContractJsonSerializer (dict.GetType ());
1446 var stream = new MemoryStream ();
1447 serializer.WriteObject (stream, dict);
1448 stream.Position = 0;
1450 Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
1451 stream.Position = 0;
1452 dict = (MyDictionary<string,string>) serializer.ReadObject (stream);
1453 Assert.AreEqual (1, dict.Count, "#2");
1454 Assert.AreEqual ("value", dict ["key"], "#3");
1458 public void ExplicitCustomDictionarySerialization ()
1460 var dict = new MyExplicitDictionary<string,string> ();
1461 dict.Add ("key", "value");
1462 var serializer = new DataContractJsonSerializer (dict.GetType ());
1463 var stream = new MemoryStream ();
1464 serializer.WriteObject (stream, dict);
1465 stream.Position = 0;
1467 Assert.AreEqual ("[{\"Key\":\"key\",\"Value\":\"value\"}]", new StreamReader (stream).ReadToEnd (), "#1");
1468 stream.Position = 0;
1469 dict = (MyExplicitDictionary<string,string>) serializer.ReadObject (stream);
1470 Assert.AreEqual (1, dict.Count, "#2");
1471 Assert.AreEqual ("value", dict ["key"], "#3");
1475 public void Bug13485 ()
1477 const string json = "{ \"Name\" : \"Test\", \"Value\" : \"ValueA\" }";
1479 string result = string.Empty;
1480 var serializer = new DataContractJsonSerializer (typeof (Bug13485Type));
1481 Bug13485Type entity;
1482 using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
1483 entity = (Bug13485Type) serializer.ReadObject (stream);
1485 result = entity.GetValue;
1486 Assert.AreEqual ("ValueA", result, "#1");
1489 [DataContract(Name = "UriTest")]
1490 public class UriTest
1492 [DataMember(Name = "members")]
1493 public Uri MembersRelativeLink { get; set; }
1497 public void Bug15169 ()
1499 const string json = "{\"members\":\"foo/bar/members\"}";
1500 var serializer = new DataContractJsonSerializer (typeof (UriTest));
1502 using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (json)))
1503 entity = (UriTest) serializer.ReadObject (stream);
1505 Assert.AreEqual ("foo/bar/members", entity.MembersRelativeLink.ToString ());
1508 #region Test methods for collection serialization
1511 public void TestArrayListSerialization ()
1513 var collection = new ArrayListContainer ();
1514 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1515 var expectedItemsCount = 4;
1517 var serializer = new DataContractJsonSerializer (collection.GetType ());
1518 var stream = new MemoryStream ();
1519 serializer.WriteObject (stream, collection);
1521 stream.Position = 0;
1522 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1524 stream.Position = 0;
1525 collection = (ArrayListContainer) serializer.ReadObject (stream);
1527 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1531 [ExpectedException (typeof (InvalidDataContractException))]
1532 public void TestBitArraySerialization ()
1534 var collection = new BitArrayContainer ();
1535 var serializer = new DataContractJsonSerializer (collection.GetType ());
1536 var stream = new MemoryStream ();
1537 serializer.WriteObject (stream, collection);
1541 public void TestHashtableSerialization ()
1543 var collection = new HashtableContainer ();
1544 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1546 var serializer = new DataContractJsonSerializer (collection.GetType ());
1547 var stream = new MemoryStream ();
1548 serializer.WriteObject (stream, collection);
1550 stream.Position = 0;
1551 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1555 [ExpectedException (typeof (ArgumentException))]
1556 public void TestHashtableDeserialization ()
1558 var collection = new HashtableContainer ();
1559 var serializer = new DataContractJsonSerializer (collection.GetType ());
1560 var stream = new MemoryStream ();
1561 serializer.WriteObject (stream, collection);
1563 stream.Position = 0;
1564 serializer.ReadObject (stream);
1568 [ExpectedException (typeof (InvalidDataContractException))]
1569 public void TestQueueSerialization ()
1571 var collection = new QueueContainer ();
1572 var serializer = new DataContractJsonSerializer (collection.GetType ());
1573 var stream = new MemoryStream ();
1574 serializer.WriteObject (stream, collection);
1578 public void TestSortedListSerialization ()
1580 var collection = new SortedListContainer ();
1581 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1583 var serializer = new DataContractJsonSerializer (collection.GetType ());
1584 var stream = new MemoryStream ();
1585 serializer.WriteObject (stream, collection);
1587 stream.Position = 0;
1588 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1592 [ExpectedException (typeof (ArgumentException))]
1593 public void TestSortedListDeserialization ()
1595 var collection = new SortedListContainer ();
1596 var serializer = new DataContractJsonSerializer (collection.GetType ());
1597 var stream = new MemoryStream ();
1598 serializer.WriteObject (stream, collection);
1600 stream.Position = 0;
1601 serializer.ReadObject (stream);
1605 [ExpectedException (typeof (InvalidDataContractException))]
1606 public void TestStackSerialization ()
1608 var collection = new StackContainer ();
1609 var serializer = new DataContractJsonSerializer (collection.GetType ());
1610 var stream = new MemoryStream ();
1611 serializer.WriteObject (stream, collection);
1615 public void TestEnumerableWithAddSerialization ()
1617 var collection = new EnumerableWithAddContainer ();
1618 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1619 var expectedItemsCount = 4;
1621 var serializer = new DataContractJsonSerializer (collection.GetType ());
1622 var stream = new MemoryStream ();
1623 serializer.WriteObject (stream, collection);
1625 stream.Position = 0;
1626 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1628 stream.Position = 0;
1629 collection = (EnumerableWithAddContainer) serializer.ReadObject (stream);
1631 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1635 [ExpectedException (typeof (InvalidDataContractException))]
1636 public void TestEnumerableWithSpecialAddSerialization ()
1638 var collection = new EnumerableWithSpecialAddContainer ();
1639 var serializer = new DataContractJsonSerializer (collection.GetType ());
1640 var stream = new MemoryStream ();
1641 serializer.WriteObject (stream, collection);
1645 public void TestHashSetSerialization ()
1647 var collection = new GenericHashSetContainer ();
1648 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1649 var expectedItemsCount = 2;
1651 var serializer = new DataContractJsonSerializer (collection.GetType ());
1652 var stream = new MemoryStream ();
1653 serializer.WriteObject (stream, collection);
1655 stream.Position = 0;
1656 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1658 stream.Position = 0;
1659 collection = (GenericHashSetContainer) serializer.ReadObject (stream);
1661 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1665 public void TestLinkedListSerialization ()
1667 var collection = new GenericLinkedListContainer ();
1668 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1669 var expectedItemsCount = 4;
1671 var serializer = new DataContractJsonSerializer (collection.GetType ());
1672 var stream = new MemoryStream ();
1673 serializer.WriteObject (stream, collection);
1675 stream.Position = 0;
1676 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1678 stream.Position = 0;
1679 collection = (GenericLinkedListContainer) serializer.ReadObject (stream);
1681 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1685 [ExpectedException (typeof (InvalidDataContractException))]
1686 public void TestGenericQueueSerialization ()
1688 var collection = new GenericQueueContainer ();
1689 var serializer = new DataContractJsonSerializer (collection.GetType ());
1690 var stream = new MemoryStream ();
1691 serializer.WriteObject (stream, collection);
1695 [ExpectedException (typeof (InvalidDataContractException))]
1696 public void TestGenericStackSerialization ()
1698 var collection = new GenericStackContainer ();
1699 var serializer = new DataContractJsonSerializer (collection.GetType ());
1700 var stream = new MemoryStream ();
1701 serializer.WriteObject (stream, collection);
1705 public void TestGenericDictionarySerialization ()
1707 var collection = new GenericDictionaryContainer ();
1708 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1709 var serializer = new DataContractJsonSerializer (collection.GetType ());
1710 var stream = new MemoryStream ();
1711 serializer.WriteObject (stream, collection);
1713 stream.Position = 0;
1714 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1718 [ExpectedException (typeof (ArgumentException))]
1719 public void TestGenericDictionaryDeserialization ()
1721 var collection = new GenericDictionaryContainer ();
1722 var serializer = new DataContractJsonSerializer (collection.GetType ());
1723 var stream = new MemoryStream ();
1724 serializer.WriteObject (stream, collection);
1726 stream.Position = 0;
1727 serializer.ReadObject (stream);
1731 public void TestGenericSortedListSerialization ()
1733 var collection = new GenericSortedListContainer ();
1734 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1735 var serializer = new DataContractJsonSerializer (collection.GetType ());
1736 var stream = new MemoryStream ();
1737 serializer.WriteObject (stream, collection);
1739 stream.Position = 0;
1740 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1744 [ExpectedException (typeof (ArgumentException))]
1745 public void TestGenericSortedListDeserialization ()
1747 var collection = new GenericSortedListContainer ();
1748 var serializer = new DataContractJsonSerializer (collection.GetType ());
1749 var stream = new MemoryStream ();
1750 serializer.WriteObject (stream, collection);
1752 stream.Position = 0;
1753 serializer.ReadObject (stream);
1757 public void TestGenericSortedDictionarySerialization ()
1759 var collection = new GenericSortedDictionaryContainer ();
1760 var expectedOutput = "{\"Items\":[{\"Key\":\"key1\",\"Value\":\"banana\"},{\"Key\":\"key2\",\"Value\":\"apple\"}]}";
1761 var serializer = new DataContractJsonSerializer (collection.GetType ());
1762 var stream = new MemoryStream ();
1763 serializer.WriteObject (stream, collection);
1765 stream.Position = 0;
1766 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1770 [ExpectedException (typeof (ArgumentException))]
1771 public void TestGenericSortedDictionaryDeserialization ()
1773 var collection = new GenericSortedDictionaryContainer ();
1774 var serializer = new DataContractJsonSerializer (collection.GetType ());
1775 var stream = new MemoryStream ();
1776 serializer.WriteObject (stream, collection);
1778 stream.Position = 0;
1779 serializer.ReadObject (stream);
1783 public void TestGenericEnumerableWithAddSerialization ()
1785 var collection = new GenericEnumerableWithAddContainer ();
1786 var expectedOutput = "{\"Items\":[\"banana\",\"apple\"]}";
1787 var expectedItemsCount = 4;
1789 var serializer = new DataContractJsonSerializer (collection.GetType ());
1790 var stream = new MemoryStream ();
1791 serializer.WriteObject (stream, collection);
1793 stream.Position = 0;
1794 Assert.AreEqual (expectedOutput, new StreamReader (stream).ReadToEnd (), "#1");
1796 stream.Position = 0;
1797 collection = (GenericEnumerableWithAddContainer) serializer.ReadObject (stream);
1799 Assert.AreEqual (expectedItemsCount, collection.Items.Count, "#2");
1803 [ExpectedException (typeof (InvalidDataContractException))]
1804 public void TestGenericEnumerableWithSpecialAddSerialization ()
1806 var collection = new GenericEnumerableWithSpecialAddContainer ();
1807 var serializer = new DataContractJsonSerializer (collection.GetType ());
1808 var stream = new MemoryStream ();
1809 serializer.WriteObject (stream, collection);
1813 [ExpectedException (typeof (InvalidDataContractException))]
1814 public void TestNonCollectionGetOnlyProperty ()
1816 var o = new NonCollectionGetOnlyContainer ();
1817 var serializer = new DataContractJsonSerializer (o.GetType ());
1818 var stream = new MemoryStream ();
1819 serializer.WriteObject (stream, o);
1825 public class CharTest
1830 public class TestData
1832 public string Foo { get; set; }
1833 public string Bar { get; set; }
1834 internal string Baz { get; set; }
1837 public enum Colors {
1841 [DataContract (Name = "_ColorsWithDC")]
1842 public enum ColorsWithDC {
1844 [EnumMember (Value = "_Red")]
1852 public enum ColorsEnumMemberNoDC {
1853 [EnumMember (Value = "_Red")]
1861 public class DCWithEnum {
1862 [DataMember (Name = "_colors")]
1863 public Colors colors;
1867 public class DCEmpty
1869 // serializer doesn't touch it.
1870 public string Foo = "TEST";
1874 public class DCSimple1
1877 public string Foo = "TEST";
1881 public class DCHasNonDC
1884 public NonDC Hoge= new NonDC ();
1889 public string Whee = "whee!";
1893 public class DCHasSerializable
1896 public SimpleSer1 Ser = new SimpleSer1 ();
1899 [DataContract (Name = "Foo")]
1900 public class DCWithName
1902 [DataMember (Name = "FooMember")]
1903 public string DMWithName = "value";
1906 [DataContract (Name = "")]
1907 public class DCWithEmptyName
1913 [DataContract (Name = null)]
1914 public class DCWithNullName
1920 [DataContract (Namespace = "")]
1921 public class DCWithEmptyNamespace
1928 public class SimpleSer1
1930 public string Doh = "doh!";
1933 public class Wrapper
1936 public class DCWrapped
1942 public class CollectionContainer
1944 Collection<string> items = new Collection<string> ();
1947 public Collection<string> Items {
1948 get { return items; }
1952 [CollectionDataContract]
1953 public class DataCollection<T> : Collection<T>
1958 public class DataCollectionContainer
1960 DataCollection<string> items = new DataCollection<string> ();
1963 public DataCollection<string> Items {
1964 get { return items; }
1969 class SerializeNonDCArrayType
1972 public NonDCItem [] IPAddresses = new NonDCItem [0];
1975 public class NonDCItem
1977 public byte [] Data { get; set; }
1981 public class VerifyObjectNameTestData
1984 string Member1 = "foo";
1988 public class KeyValueTestData {
1989 public List<KeyValuePair<string,string>> TestData = new List<KeyValuePair<string,string>>();
1992 [DataContract] // bug #586169
1995 [DataMember (Order=1)]
1996 public DateTime StartDate { get; set; }
1997 [DataMember (Order=2)]
1998 public DateTime EndDate { get; set; }
2001 public class ClassA {
2002 public ClassB B { get; set; }
2009 public class GSPlayerListErg
2011 public GSPlayerListErg ()
2022 public void OnDeserializing (StreamingContext c)
2029 void OnDeserialized (StreamingContext c)
2034 public static bool A, B, C;
2036 [DataMember (Name = "T")]
2037 public long CodedServerTimeUTC { get; set; }
2038 public DateTime ServerTimeUTC { get; set; }
2048 public class MyDictionary<K, V> : System.Collections.Generic.IDictionary<K, V>
2050 Dictionary<K,V> dic = new Dictionary<K,V> ();
2052 public void Add (K key, V value)
2054 dic.Add (key, value);
2057 public bool ContainsKey (K key)
2059 return dic.ContainsKey (key);
2062 public ICollection<K> Keys {
2063 get { return dic.Keys; }
2066 public bool Remove (K key)
2068 return dic.Remove (key);
2071 public bool TryGetValue (K key, out V value)
2073 return dic.TryGetValue (key, out value);
2076 public ICollection<V> Values {
2077 get { return dic.Values; }
2080 public V this [K key] {
2081 get { return dic [key]; }
2082 set { dic [key] = value; }
2085 IEnumerator IEnumerable.GetEnumerator ()
2087 return dic.GetEnumerator ();
2090 ICollection<KeyValuePair<K,V>> Coll {
2091 get { return (ICollection<KeyValuePair<K,V>>) dic; }
2094 public void Add (KeyValuePair<K, V> item)
2099 public void Clear ()
2104 public bool Contains (KeyValuePair<K, V> item)
2106 return Coll.Contains (item);
2109 public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
2111 Coll.CopyTo (array, arrayIndex);
2115 get { return dic.Count; }
2118 public bool IsReadOnly {
2119 get { return Coll.IsReadOnly; }
2122 public bool Remove (KeyValuePair<K, V> item)
2124 return Coll.Remove (item);
2127 public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
2129 return Coll.GetEnumerator ();
2133 public class MyExplicitDictionary<K, V> : IDictionary<K, V> {
2135 Dictionary<K,V> dic = new Dictionary<K,V> ();
2137 public void Add (K key, V value)
2139 dic.Add (key, value);
2142 public bool ContainsKey (K key)
2144 return dic.ContainsKey (key);
2147 ICollection<K> IDictionary<K, V>.Keys {
2148 get { return dic.Keys; }
2151 public bool Remove (K key)
2153 return dic.Remove (key);
2156 public bool TryGetValue (K key, out V value)
2158 return dic.TryGetValue (key, out value);
2161 ICollection<V> IDictionary<K, V>.Values {
2162 get { return dic.Values; }
2165 public V this [K key] {
2166 get { return dic [key]; }
2167 set { dic [key] = value; }
2170 IEnumerator IEnumerable.GetEnumerator ()
2172 return dic.GetEnumerator ();
2175 ICollection<KeyValuePair<K,V>> Coll {
2176 get { return (ICollection<KeyValuePair<K,V>>) dic; }
2179 public void Add (KeyValuePair<K, V> item)
2184 public void Clear ()
2189 public bool Contains (KeyValuePair<K, V> item)
2191 return Coll.Contains (item);
2194 public void CopyTo (KeyValuePair<K, V> [] array, int arrayIndex)
2196 Coll.CopyTo (array, arrayIndex);
2200 get { return dic.Count; }
2203 public bool IsReadOnly {
2204 get { return Coll.IsReadOnly; }
2207 public bool Remove (KeyValuePair<K, V> item)
2209 return Coll.Remove (item);
2212 public IEnumerator<KeyValuePair<K, V>> GetEnumerator ()
2214 return Coll.GetEnumerator ();
2219 public class Bug13485Type
2222 public string Name { get; set; }
2224 [DataMember (Name = "Value")]
2225 private string Value { get; set; }
2227 public string GetValue { get { return this.Value; } }
2230 #region Test classes for Collection serialization
2233 public abstract class CollectionContainer <V>
2241 if (items == null) items = Init ();
2246 public CollectionContainer ()
2251 protected abstract V Init ();
2255 public class ArrayListContainer : CollectionContainer<ArrayList> {
2256 protected override ArrayList Init ()
2258 return new ArrayList { "banana", "apple" };
2263 public class BitArrayContainer : CollectionContainer<BitArray> {
2264 protected override BitArray Init ()
2266 return new BitArray (new [] { false, true });
2271 public class HashtableContainer : CollectionContainer<Hashtable> {
2272 protected override Hashtable Init ()
2274 var ht = new Hashtable ();
2275 ht.Add ("key1", "banana");
2276 ht.Add ("key2", "apple");
2282 public class QueueContainer : CollectionContainer<Queue> {
2283 protected override Queue Init ()
2285 var q = new Queue ();
2286 q.Enqueue ("banana");
2287 q.Enqueue ("apple");
2293 public class SortedListContainer : CollectionContainer<SortedList> {
2294 protected override SortedList Init ()
2296 var l = new SortedList ();
2297 l.Add ("key1", "banana");
2298 l.Add ("key2", "apple");
2304 public class StackContainer : CollectionContainer<Stack> {
2305 protected override Stack Init ()
2307 var s = new Stack ();
2314 public class EnumerableWithAdd : IEnumerable
2316 private ArrayList items;
2318 public EnumerableWithAdd()
2320 items = new ArrayList();
2323 public IEnumerator GetEnumerator()
2325 return items.GetEnumerator();
2328 public void Add(object value)
2341 public class EnumerableWithSpecialAdd : IEnumerable
2343 private ArrayList items;
2345 public EnumerableWithSpecialAdd()
2347 items = new ArrayList();
2350 public IEnumerator GetEnumerator()
2352 return items.GetEnumerator();
2355 public void Add(object value, int index)
2370 public class EnumerableWithAddContainer : CollectionContainer<EnumerableWithAdd>
2372 protected override EnumerableWithAdd Init()
2374 var s = new EnumerableWithAdd();
2382 public class EnumerableWithSpecialAddContainer : CollectionContainer<EnumerableWithSpecialAdd>
2384 protected override EnumerableWithSpecialAdd Init()
2386 var s = new EnumerableWithSpecialAdd();
2394 public class GenericDictionaryContainer : CollectionContainer<Dictionary<string, string>> {
2395 protected override Dictionary<string, string> Init ()
2397 var d = new Dictionary<string, string> ();
2398 d.Add ("key1", "banana");
2399 d.Add ("key2", "apple");
2405 public class GenericHashSetContainer : CollectionContainer<HashSet<string>> {
2406 protected override HashSet<string> Init ()
2408 return new HashSet<string> { "banana", "apple" };
2413 public class GenericLinkedListContainer : CollectionContainer<LinkedList<string>> {
2414 protected override LinkedList<string> Init ()
2416 var l = new LinkedList<string> ();
2417 l.AddFirst ("apple");
2418 l.AddFirst ("banana");
2424 public class GenericListContainer : CollectionContainer<List<string>> {
2425 protected override List<string> Init ()
2427 return new List<string> { "banana", "apple" };
2432 public class GenericQueueContainer : CollectionContainer<Queue<string>> {
2433 protected override Queue<string> Init ()
2435 var q = new Queue<string> ();
2436 q.Enqueue ("banana");
2437 q.Enqueue ("apple" );
2443 public class GenericSortedDictionaryContainer : CollectionContainer<SortedDictionary<string, string>> {
2444 protected override SortedDictionary<string, string> Init ()
2446 var d = new SortedDictionary<string, string> ();
2447 d.Add ("key1", "banana");
2448 d.Add ("key2", "apple");
2454 public class GenericSortedListContainer : CollectionContainer<SortedList<string, string>> {
2455 protected override SortedList<string, string> Init ()
2457 var d = new SortedList<string, string> ();
2458 d.Add ("key1", "banana");
2459 d.Add ("key2", "apple");
2465 public class GenericStackContainer : CollectionContainer<Stack<string>> {
2466 protected override Stack<string> Init ()
2468 var s = new Stack<string> ();
2475 public class GenericEnumerableWithAdd : IEnumerable<string>
2477 private List<string> items;
2479 public GenericEnumerableWithAdd()
2481 items = new List<string>();
2484 IEnumerator IEnumerable.GetEnumerator()
2486 return items.GetEnumerator ();
2489 public IEnumerator<string> GetEnumerator()
2491 return items.GetEnumerator ();
2494 public void Add(string value)
2507 public class GenericEnumerableWithSpecialAdd : IEnumerable<string>
2509 private List<string> items;
2511 public GenericEnumerableWithSpecialAdd()
2513 items = new List<string>();
2516 IEnumerator IEnumerable.GetEnumerator()
2518 return items.GetEnumerator ();
2521 public IEnumerator<string> GetEnumerator()
2523 return items.GetEnumerator ();
2526 public void Add(string value, int index)
2541 public class GenericEnumerableWithAddContainer : CollectionContainer<GenericEnumerableWithAdd>
2543 protected override GenericEnumerableWithAdd Init()
2545 var s = new GenericEnumerableWithAdd();
2553 public class GenericEnumerableWithSpecialAddContainer : CollectionContainer<GenericEnumerableWithSpecialAdd>
2555 protected override GenericEnumerableWithSpecialAdd Init()
2557 var s = new GenericEnumerableWithSpecialAdd();
2565 public class NonCollectionGetOnlyContainer
2567 string _test = "my string";
2570 public string MyString {