2 // XmlObjectSerializerTest.cs
5 // Atsushi Enomoto <atsushi@ximian.com>
6 // Ankit Jain <JAnkit@novell.com>
8 // Copyright (C) 2005 Novell, Inc. http://www.novell.com
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 // This test code contains tests for both DataContractSerializer and
33 // NetDataContractSerializer. The code could be mostly common.
37 using System.Collections;
38 using System.Collections.Generic;
39 using System.Collections.ObjectModel;
43 using System.Runtime.Serialization;
46 using System.Xml.Schema;
47 using System.Xml.Serialization;
48 using NUnit.Framework;
50 [assembly: ContractNamespace ("http://www.u2u.be/samples/wcf/2009", ClrNamespace = "U2U.DataContracts")] // bug #599889
52 namespace MonoTests.System.Runtime.Serialization
55 public class DataContractSerializerTest
57 static readonly XmlWriterSettings settings;
59 static DataContractSerializerTest ()
61 settings = new XmlWriterSettings ();
62 settings.OmitXmlDeclaration = true;
69 public string Member1;
73 [ExpectedException (typeof (ArgumentNullException))]
74 public void ConstructorTypeNull ()
76 new DataContractSerializer (null);
80 public void ConstructorKnownTypesNull ()
82 // null knownTypes is allowed.
83 new DataContractSerializer (typeof (Sample1), null);
84 new DataContractSerializer (typeof (Sample1), "Foo", String.Empty, null);
85 new DataContractSerializer (typeof (Sample1), new XmlDictionary ().Add ("Foo"), XmlDictionaryString.Empty, null);
89 [ExpectedException (typeof (ArgumentNullException))]
90 public void ConstructorNameNull ()
92 new DataContractSerializer (typeof (Sample1), null, String.Empty);
96 [ExpectedException (typeof (ArgumentNullException))]
97 public void ConstructorNamespaceNull ()
99 new DataContractSerializer (typeof (Sample1), "foo", null);
103 [ExpectedException (typeof (ArgumentOutOfRangeException))]
104 public void ConstructorNegativeMaxObjects ()
106 new DataContractSerializer (typeof (Sample1), null,
107 -1, false, false, null);
111 public void ConstructorMisc ()
113 new DataContractSerializer (typeof (GlobalSample1));
117 public void WriteObjectContent ()
119 StringWriter sw = new StringWriter ();
120 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
121 DataContractSerializer ser =
122 new DataContractSerializer (typeof (string));
123 xw.WriteStartElement ("my-element");
124 ser.WriteObjectContent (xw, "TEST STRING");
125 xw.WriteEndElement ();
127 Assert.AreEqual ("<my-element>TEST STRING</my-element>",
132 public void WriteObjectToStream ()
134 DataContractSerializer ser =
135 new DataContractSerializer (typeof (int));
136 MemoryStream sw = new MemoryStream ();
137 ser.WriteObject (sw, 1);
138 string expected = "<int xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">1</int>";
139 byte[] buf = sw.ToArray ();
140 Assert.AreEqual (expected, Encoding.UTF8.GetString (buf, 0, buf.Length));
144 public void ReadObjectFromStream ()
146 DataContractSerializer ser =
147 new DataContractSerializer (typeof (int));
148 string expected = "<int xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">1</int>";
149 byte[] buf = Encoding.UTF8.GetBytes (expected);
150 MemoryStream sw = new MemoryStream (buf);
151 object res = ser.ReadObject (sw);
152 Assert.AreEqual (1, res);
158 public void SerializeInt ()
160 DataContractSerializer ser =
161 new DataContractSerializer (typeof (int));
162 SerializeInt (ser, "<int xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">1</int>");
167 [Category ("NotWorking")]
168 public void NetSerializeInt ()
170 NetDataContractSerializer ser =
171 new NetDataContractSerializer ();
172 // z:Assembly="0" ???
173 SerializeInt (ser, String.Format ("<int z:Type=\"System.Int32\" z:Assembly=\"0\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">1</int>", typeof (int).Assembly.FullName));
176 void SerializeInt (XmlObjectSerializer ser, string expected)
178 StringWriter sw = new StringWriter ();
179 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
180 ser.WriteObject (w, 1);
182 Assert.AreEqual (expected, sw.ToString ());
185 // pass typeof(DCEmpty), serialize int
188 public void SerializeIntForDCEmpty ()
190 DataContractSerializer ser =
191 new DataContractSerializer (typeof (DCEmpty));
193 SerializeIntForDCEmpty (ser, "<DCEmpty xmlns:d1p1=\"http://www.w3.org/2001/XMLSchema\" i:type=\"d1p1:int\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\">1</DCEmpty>");
196 void SerializeIntForDCEmpty (XmlObjectSerializer ser, string expected)
198 StringWriter sw = new StringWriter ();
199 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
200 ser.WriteObject (w, 1);
202 XmlComparer.AssertAreEqual (expected, sw.ToString ());
208 public void SerializeEmptyClass ()
210 DataContractSerializer ser =
211 new DataContractSerializer (typeof (DCEmpty));
212 SerializeEmptyClass (ser, "<DCEmpty xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\" />");
216 [Category ("NotWorking")]
217 public void NetSerializeEmptyClass ()
219 NetDataContractSerializer ser =
220 new NetDataContractSerializer ();
221 SerializeEmptyClass (ser, String.Format ("<DCEmpty xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" z:Id=\"1\" z:Type=\"MonoTests.System.Runtime.Serialization.DCEmpty\" z:Assembly=\"{0}\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\" />", this.GetType ().Assembly.FullName));
224 void SerializeEmptyClass (XmlObjectSerializer ser, string expected)
226 StringWriter sw = new StringWriter ();
227 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
228 ser.WriteObject (w, new DCEmpty ());
230 Assert.AreEqual (expected, sw.ToString ());
236 public void SerializeEmptyNoNSClass ()
238 var ser = new DataContractSerializer (typeof (DCEmptyNoNS));
239 SerializeEmptyNoNSClass (ser, "<DCEmptyNoNS xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" />");
242 void SerializeEmptyNoNSClass (XmlObjectSerializer ser, string expected)
244 var sw = new StringWriter ();
245 using (var w = XmlWriter.Create (sw, settings)) {
246 ser.WriteObject (w, new DCEmptyNoNS ());
248 Assert.AreEqual (expected, sw.ToString ());
250 // string (primitive)
253 public void SerializePrimitiveString ()
255 XmlObjectSerializer ser =
256 new DataContractSerializer (typeof (string));
257 SerializePrimitiveString (ser, "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">TEST</string>");
261 [Category ("NotWorking")]
262 public void NetSerializePrimitiveString ()
264 XmlObjectSerializer ser = new NetDataContractSerializer ();
265 SerializePrimitiveString (ser, "<string z:Type=\"System.String\" z:Assembly=\"0\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">TEST</string>");
268 void SerializePrimitiveString (XmlObjectSerializer ser, string expected)
270 StringWriter sw = new StringWriter ();
271 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
272 ser.WriteObject (w, "TEST");
274 Assert.AreEqual (expected, sw.ToString ());
277 // QName (primitive but ...)
280 [Ignore ("These tests would not make any sense right now since it's populated prefix is not testable.")]
281 public void SerializePrimitiveQName ()
283 XmlObjectSerializer ser =
284 new DataContractSerializer (typeof (XmlQualifiedName));
285 SerializePrimitiveQName (ser, "<z:QName xmlns:d7=\"urn:foo\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\">d7:foo</z:QName>");
289 [Ignore ("These tests would not make any sense right now since it's populated prefix is not testable.")]
290 public void NetSerializePrimitiveQName ()
292 XmlObjectSerializer ser = new NetDataContractSerializer ();
293 SerializePrimitiveQName (ser, "<z:QName z:Type=\"System.Xml.XmlQualifiedName\" z:Assembly=\"System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" xmlns:d7=\"urn:foo\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\">d7:foo</z:QName>");
296 void SerializePrimitiveQName (XmlObjectSerializer ser, string expected)
298 StringWriter sw = new StringWriter ();
299 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
300 ser.WriteObject (w, new XmlQualifiedName ("foo", "urn:foo"));
302 Assert.AreEqual (expected, sw.ToString ());
308 public void SerializeSimpleClass1 ()
310 DataContractSerializer ser =
311 new DataContractSerializer (typeof (DCSimple1));
312 SerializeSimpleClass1 (ser, "<DCSimple1 xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\"><Foo>TEST</Foo></DCSimple1>");
316 [ExpectedException (typeof (SerializationException))]
317 [Category ("NotWorking")] // behavior changed in 3.5/SP1
318 public void SerializeSimpleXml ()
320 DataContractSerializer ser =
321 new DataContractSerializer (typeof (SimpleXml));
322 SerializeSimpleClass1 (ser, @"<simple i:type=""d1p1:DCSimple1"" xmlns:d1p1=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><d1p1:Foo>TEST</d1p1:Foo></simple>");
326 [Category ("NotWorking")]
327 public void NetSerializeSimpleClass1 ()
329 NetDataContractSerializer ser =
330 new NetDataContractSerializer ();
331 SerializeSimpleClass1 (ser, String.Format ("<DCSimple1 xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" z:Id=\"1\" z:Type=\"MonoTests.System.Runtime.Serialization.DCSimple1\" z:Assembly=\"{0}\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\"><Foo z:Id=\"2\">TEST</Foo></DCSimple1>", this.GetType ().Assembly.FullName));
334 void SerializeSimpleClass1 (XmlObjectSerializer ser, string expected)
336 StringWriter sw = new StringWriter ();
337 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
338 ser.WriteObject (w, new DCSimple1 ());
340 Console.WriteLine(sw.ToString());
341 Assert.AreEqual (expected, sw.ToString ());
344 // NonDC (behavior changed in 3.5/SP1; not it's not rejected)
347 public void SerializeNonDC ()
349 DataContractSerializer ser = new DataContractSerializer (typeof (NonDC));
350 var sw = new StringWriter ();
351 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
352 ser.WriteObject (w, new NonDC ());
354 Assert.AreEqual ("<NonDC xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization'><Whee>whee!</Whee></NonDC>".Replace ('\'', '"'), sw.ToString ());
360 public void SerializeDCHasNonDC ()
362 DataContractSerializer ser = new DataContractSerializer (typeof (DCHasNonDC));
363 var sw = new StringWriter ();
364 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
365 ser.WriteObject (w, new DCHasNonDC ());
367 Assert.AreEqual ("<DCHasNonDC xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization'><Hoge><Whee>whee!</Whee></Hoge></DCHasNonDC>".Replace ('\'', '"'), sw.ToString ());
373 // DCHasSerializable itself is DataContract and has a field
374 // whose type is not contract but serializable.
375 public void SerializeSimpleSerializable1 ()
377 DataContractSerializer ser = new DataContractSerializer (typeof (DCHasSerializable));
378 StringWriter sw = new StringWriter ();
379 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
380 ser.WriteObject (w, new DCHasSerializable ());
382 Assert.AreEqual ("<DCHasSerializable xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\"><Ser><Doh>doh!</Doh></Ser></DCHasSerializable>", sw.ToString ());
386 public void SerializeDCWithName ()
388 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithName));
389 StringWriter sw = new StringWriter ();
390 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
391 ser.WriteObject (w, new DCWithName ());
393 Assert.AreEqual ("<Foo xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\"><FooMember>value</FooMember></Foo>", sw.ToString ());
397 public void SerializeDCWithEmptyName1 ()
399 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithEmptyName));
400 StringWriter sw = new StringWriter ();
401 DCWithEmptyName dc = new DCWithEmptyName ();
402 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
404 ser.WriteObject (w, dc);
405 } catch (InvalidDataContractException) {
409 Assert.Fail ("Expected InvalidDataContractException");
413 [Category ("NotWorking")]
414 public void SerializeDCWithEmptyName2 ()
416 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithName));
417 StringWriter sw = new StringWriter ();
419 /* DataContractAttribute.Name == "", not valid */
420 DCWithEmptyName dc = new DCWithEmptyName ();
421 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
423 ser.WriteObject (w, dc);
424 } catch (InvalidDataContractException) {
428 Assert.Fail ("Expected InvalidDataContractException");
432 [Category ("NotWorking")]
433 public void SerializeDCWithNullName ()
435 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithNullName));
436 StringWriter sw = new StringWriter ();
437 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
439 /* DataContractAttribute.Name == "", not valid */
440 ser.WriteObject (w, new DCWithNullName ());
441 } catch (InvalidDataContractException) {
445 Assert.Fail ("Expected InvalidDataContractException");
449 public void SerializeDCWithEmptyNamespace1 ()
451 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithEmptyNamespace));
452 StringWriter sw = new StringWriter ();
453 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
454 ser.WriteObject (w, new DCWithEmptyNamespace ());
461 public void SerializeWrappedClass ()
463 DataContractSerializer ser =
464 new DataContractSerializer (typeof (Wrapper.DCWrapped));
465 SerializeWrappedClass (ser, "<Wrapper.DCWrapped xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\" />");
469 [Category ("NotWorking")]
470 public void NetSerializeWrappedClass ()
472 NetDataContractSerializer ser =
473 new NetDataContractSerializer ();
474 SerializeWrappedClass (ser, String.Format ("<Wrapper.DCWrapped xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" z:Id=\"1\" z:Type=\"MonoTests.System.Runtime.Serialization.Wrapper+DCWrapped\" z:Assembly=\"{0}\" xmlns:z=\"http://schemas.microsoft.com/2003/10/Serialization/\" xmlns=\"http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization\" />", this.GetType ().Assembly.FullName));
477 void SerializeWrappedClass (XmlObjectSerializer ser, string expected)
479 StringWriter sw = new StringWriter ();
480 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
481 ser.WriteObject (w, new Wrapper.DCWrapped ());
483 Assert.AreEqual (expected, sw.ToString ());
488 // CollectionContainer : Items must have a setter.
489 [ExpectedException (typeof (InvalidDataContractException))]
490 [Category ("NotWorking")]
492 public void SerializeReadOnlyCollectionMember ()
494 DataContractSerializer ser =
495 new DataContractSerializer (typeof (CollectionContainer));
497 StringWriter sw = new StringWriter ();
498 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
499 ser.WriteObject (w, null);
501 Assert.AreEqual ("<CollectionContainer i:nil='true' xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization' />".Replace ('\'', '"'), sw.ToString (), "#1");
503 sw = new StringWriter ();
504 var c = new CollectionContainer ();
507 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
508 ser.WriteObject (w, c);
510 Assert.AreEqual ("<CollectionContainer xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization'><Items xmlns:d2p1='http://schemas.microsoft.com/2003/10/Serialization/Arrays'><d2p1:string>foo</d2p1:string><d2p1:string>bar</d2p1:string></Items></CollectionContainer>".Replace ('\'', '"'), sw.ToString (), "#2");
513 // DataCollectionContainer : Items must have a setter.
515 //[ExpectedException (typeof (InvalidDataContractException))]
516 public void SerializeReadOnlyDataCollectionMember ()
518 DataContractSerializer ser =
519 new DataContractSerializer (typeof (DataCollectionContainer));
520 StringWriter sw = new StringWriter ();
521 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
522 ser.WriteObject (w, null);
524 Assert.AreEqual ("<DataCollectionContainer i:nil='true' xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization' />".Replace ('\'', '"'), sw.ToString (), "#1");
526 sw = new StringWriter ();
527 var c = new DataCollectionContainer ();
530 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
531 ser.WriteObject (w, c);
533 // LAMESPEC: this is bogus behavior. .NET serializes
534 // System.String as "string" without overriding its
535 // element namespace, but then it must be regarded as
536 // in parent's namespace. What if there already is an
537 // element definition for "string" with the same
539 Assert.AreEqual ("<DataCollectionContainer xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization'><Items><string>foo</string><string>bar</string></Items></DataCollectionContainer>".Replace ('\'', '"'), sw.ToString (), "#2");
543 public void SerializeGuid ()
545 DataContractSerializer ser = new DataContractSerializer (typeof (Guid));
546 StringWriter sw = new StringWriter ();
547 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
548 ser.WriteObject (w, Guid.Empty);
551 "<guid xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">00000000-0000-0000-0000-000000000000</guid>",
556 public void SerializeEnum ()
558 DataContractSerializer ser = new DataContractSerializer (typeof (Colors));
559 StringWriter sw = new StringWriter ();
560 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
561 ser.WriteObject (w, new Colors ());
565 @"<Colors xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">Red</Colors>",
570 public void SerializeEnum2 ()
572 DataContractSerializer ser = new DataContractSerializer (typeof (Colors));
573 StringWriter sw = new StringWriter ();
574 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
575 ser.WriteObject (w, 0);
578 XmlComparer.AssertAreEqual (
579 @"<Colors xmlns:d1p1=""http://www.w3.org/2001/XMLSchema"" i:type=""d1p1:int"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">0</Colors>",
584 public void SerializeEnumWithDC ()
586 DataContractSerializer ser = new DataContractSerializer (typeof (ColorsWithDC));
587 StringWriter sw = new StringWriter ();
588 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
589 ser.WriteObject (w, new ColorsWithDC ());
593 @"<_ColorsWithDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">_Red</_ColorsWithDC>",
598 public void SerializeEnumWithNoDC ()
600 DataContractSerializer ser = new DataContractSerializer (typeof (ColorsEnumMemberNoDC));
601 StringWriter sw = new StringWriter ();
602 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
603 ser.WriteObject (w, new ColorsEnumMemberNoDC ());
607 @"<ColorsEnumMemberNoDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">Red</ColorsEnumMemberNoDC>",
612 public void SerializeEnumWithDC2 ()
614 DataContractSerializer ser = new DataContractSerializer (typeof (ColorsWithDC));
615 StringWriter sw = new StringWriter ();
616 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
617 ser.WriteObject (w, 3);
620 XmlComparer.AssertAreEqual (
621 @"<_ColorsWithDC xmlns:d1p1=""http://www.w3.org/2001/XMLSchema"" i:type=""d1p1:int"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">3</_ColorsWithDC>",
626 [ExpectedException (typeof (SerializationException))]
627 public void SerializeEnumWithDCInvalid ()
629 DataContractSerializer ser = new DataContractSerializer (typeof (ColorsWithDC));
630 StringWriter sw = new StringWriter ();
631 ColorsWithDC cdc = ColorsWithDC.Blue;
632 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
633 ser.WriteObject (w, cdc);
638 public void SerializeDCWithEnum ()
640 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithEnum));
641 StringWriter sw = new StringWriter ();
642 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
643 ser.WriteObject (w, new DCWithEnum ());
647 @"<DCWithEnum xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><_colors>Red</_colors></DCWithEnum>",
652 public void SerializeDCWithTwoEnums ()
654 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithTwoEnums));
655 StringWriter sw = new StringWriter ();
656 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
657 DCWithTwoEnums e = new DCWithTwoEnums ();
658 e.colors = Colors.Blue;
659 e.colors2 = Colors.Green;
660 ser.WriteObject (w, e);
664 @"<DCWithTwoEnums xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><colors>Blue</colors><colors2>Green</colors2></DCWithTwoEnums>",
669 public void SerializeNestingDC2 ()
671 DataContractSerializer ser = new DataContractSerializer (typeof (NestingDC2));
672 StringWriter sw = new StringWriter ();
673 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
674 NestingDC2 e = new NestingDC2 ();
675 e.Field = new NestedDC2 ("Something");
676 ser.WriteObject (w, e);
680 @"<NestingDC2 xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""test2""><Field xmlns:d2p1=""test1""><d2p1:Name>Something</d2p1:Name></Field></NestingDC2>",
685 public void SerializeNestingDC ()
687 DataContractSerializer ser = new DataContractSerializer (typeof (NestingDC));
688 StringWriter sw = new StringWriter ();
689 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
690 NestingDC e = new NestingDC ();
691 e.Field1 = new NestedDC ("test1");
692 e.Field2 = new NestedDC ("test2");
693 ser.WriteObject (w, e);
697 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><Field1><Name>test1</Name></Field1><Field2><Name>test2</Name></Field2></NestingDC>",
699 sw = new StringWriter ();
700 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
701 NestingDC e = new NestingDC ();
702 ser.WriteObject (w, e);
706 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><Field1 i:nil=""true"" /><Field2 i:nil=""true"" /></NestingDC>",
711 public void SerializeDerivedDC ()
713 DataContractSerializer ser = new DataContractSerializer (typeof (DerivedDC));
714 StringWriter sw = new StringWriter ();
715 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
716 DerivedDC e = new DerivedDC ();
717 ser.WriteObject (w, e);
721 @"<DerivedDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""Derived""><baseVal xmlns=""Base"">0</baseVal><derivedVal>0</derivedVal></DerivedDC>",
726 public void SerializerDCArray ()
728 DataContractSerializer ser = new DataContractSerializer (typeof (DCWithEnum []));
729 StringWriter sw = new StringWriter ();
730 DCWithEnum [] arr = new DCWithEnum [2];
731 arr [0] = new DCWithEnum (); arr [0].colors = Colors.Red;
732 arr [1] = new DCWithEnum (); arr [1].colors = Colors.Green;
733 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
734 ser.WriteObject (w, arr);
737 XmlComparer.AssertAreEqual (
738 @"<ArrayOfDCWithEnum xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><DCWithEnum><_colors>Red</_colors></DCWithEnum><DCWithEnum><_colors>Green</_colors></DCWithEnum></ArrayOfDCWithEnum>",
743 public void SerializerDCArray2 ()
745 List<Type> known = new List<Type> ();
746 known.Add (typeof (DCWithEnum));
747 known.Add (typeof (DCSimple1));
748 DataContractSerializer ser = new DataContractSerializer (typeof (object []), known);
749 StringWriter sw = new StringWriter ();
750 object [] arr = new object [2];
751 arr [0] = new DCWithEnum (); ((DCWithEnum)arr [0]).colors = Colors.Red;
752 arr [1] = new DCSimple1 (); ((DCSimple1) arr [1]).Foo = "hello";
754 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
755 ser.WriteObject (w, arr);
758 XmlComparer.AssertAreEqual (
759 @"<ArrayOfanyType xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""><anyType xmlns:d2p1=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"" i:type=""d2p1:DCWithEnum""><d2p1:_colors>Red</d2p1:_colors></anyType><anyType xmlns:d2p1=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"" i:type=""d2p1:DCSimple1""><d2p1:Foo>hello</d2p1:Foo></anyType></ArrayOfanyType>",
764 public void SerializerDCArray3 ()
766 DataContractSerializer ser = new DataContractSerializer (typeof (int []));
767 StringWriter sw = new StringWriter ();
768 int [] arr = new int [2];
769 arr [0] = 1; arr [1] = 2;
771 using (XmlWriter w = XmlWriter.Create (sw, settings)) {
772 ser.WriteObject (w, arr);
775 XmlComparer.AssertAreEqual (
776 @"<ArrayOfint xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""><int>1</int><int>2</int></ArrayOfint>",
781 public void SerializeNonDCArray ()
783 DataContractSerializer ser = new DataContractSerializer (typeof (SerializeNonDCArrayType));
784 StringWriter sw = new StringWriter ();
785 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
786 ser.WriteObject (xw, new SerializeNonDCArrayType ());
788 Assert.AreEqual (@"<SerializeNonDCArrayType xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><IPAddresses /></SerializeNonDCArrayType>",
793 public void SerializeNonDCArrayItems ()
795 DataContractSerializer ser = new DataContractSerializer (typeof (SerializeNonDCArrayType));
796 StringWriter sw = new StringWriter ();
797 using (XmlWriter xw = XmlWriter.Create (sw, settings)) {
798 SerializeNonDCArrayType obj = new SerializeNonDCArrayType ();
799 obj.IPAddresses = new NonDCItem [] {new NonDCItem () { Data = new int [] {1, 2, 3, 4} } };
800 ser.WriteObject (xw, obj);
803 XmlDocument doc = new XmlDocument ();
804 doc.LoadXml (sw.ToString ());
805 XmlNamespaceManager nsmgr = new XmlNamespaceManager (doc.NameTable);
806 nsmgr.AddNamespace ("s", "http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization");
807 nsmgr.AddNamespace ("n", "http://schemas.datacontract.org/2004/07/System.Net");
808 nsmgr.AddNamespace ("a", "http://schemas.microsoft.com/2003/10/Serialization/Arrays");
810 Assert.AreEqual (1, doc.SelectNodes ("/s:SerializeNonDCArrayType/s:IPAddresses/s:NonDCItem", nsmgr).Count, "#1");
811 XmlElement el = doc.SelectSingleNode ("/s:SerializeNonDCArrayType/s:IPAddresses/s:NonDCItem/s:Data", nsmgr) as XmlElement;
812 Assert.IsNotNull (el, "#3");
813 Assert.AreEqual (4, el.SelectNodes ("a:int", nsmgr).Count, "#4");
817 public void DeserializeEnum ()
819 Colors c = Deserialize<Colors> (
820 @"<Colors xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">Red</Colors>");
822 Assert.AreEqual (Colors.Red, c, "#de2");
826 public void DeserializeEnum2 ()
828 Colors c = Deserialize<Colors> (
829 @"<Colors xmlns:d1p1=""http://www.w3.org/2001/XMLSchema"" i:type=""d1p1:int"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">1</Colors>",
832 Assert.AreEqual (Colors.Green, c, "#de4");
836 [ExpectedException (typeof (SerializationException))]
837 public void DeserializeEnumInvalid1 ()
839 Deserialize<Colors> (
840 @"<Colors xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""></Colors>");
844 [ExpectedException (typeof (SerializationException))]
845 public void DeserializeEnumInvalid2 ()
847 Deserialize<Colors> (
848 @"<Colors xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""/>");
852 [ExpectedException (typeof (SerializationException))]
853 public void DeserializeEnumInvalid3 ()
855 //"red" instead of "Red"
856 Deserialize<Colors> (
857 @"<Colors xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">red</Colors>");
861 public void DeserializeEnumFlags ()
863 Deserialize<Colors2> (
864 @"<Colors2 xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""/>");
868 public void DeserializeEnumWithDC ()
870 ColorsWithDC cdc = Deserialize<ColorsWithDC> (
871 @"<_ColorsWithDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">_Red</_ColorsWithDC>");
873 Assert.AreEqual (ColorsWithDC.Red, cdc, "#de6");
877 [ExpectedException (typeof (SerializationException))]
878 public void DeserializeEnumWithDCInvalid ()
880 Deserialize<ColorsWithDC> (
881 @"<_ColorsWithDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">NonExistant</_ColorsWithDC>");
885 public void DeserializeDCWithEnum ()
887 DCWithEnum dc = Deserialize<DCWithEnum> (
888 @"<DCWithEnum xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><_colors>Red</_colors></DCWithEnum>");
890 Assert.AreEqual (Colors.Red, dc.colors, "#de8");
894 public void DeserializeNestingDC ()
896 NestingDC dc = Deserialize<NestingDC> (
897 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><Field1><Name>test1</Name></Field1><Field2><Name>test2</Name></Field2></NestingDC>");
899 Assert.IsNotNull (dc.Field1, "#N1: Field1 should not be null.");
900 Assert.IsNotNull (dc.Field2, "#N2: Field2 should not be null.");
901 Assert.AreEqual ("test1", dc.Field1.Name, "#1");
902 Assert.AreEqual ("test2", dc.Field2.Name, "#2");
906 public void DeserializeNestingDC2 ()
908 NestingDC2 dc = Deserialize<NestingDC2> (
909 @"<NestingDC2 xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""test2""><Field xmlns:d2p1=""test1""><d2p1:Name>Something</d2p1:Name></Field></NestingDC2>");
911 Assert.IsNotNull (dc.Field, "#N1: Field should not be null.");
912 Assert.AreEqual ("Something", dc.Field.Name, "#N2");
916 public void DeserializeDerivedDC ()
918 DerivedDC dc = Deserialize<DerivedDC> (
919 @"<DerivedDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""Derived""><baseVal xmlns=""Base"">1</baseVal><derivedVal>2</derivedVal></DerivedDC>");
921 Assert.AreEqual (1, dc.baseVal, "#N1");
922 Assert.AreEqual (2, dc.derivedVal, "#N2");
926 public void DeserializeTwice ()
929 @"<any><_ColorsWithDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">_Red</_ColorsWithDC> <_ColorsWithDC xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">_Red</_ColorsWithDC></any>";
930 DataContractSerializer ser = new DataContractSerializer (typeof (ColorsWithDC));
931 XmlReader xr = XmlReader.Create (new StringReader (xml), new XmlReaderSettings ());
932 xr.ReadStartElement ();
933 object o = ser.ReadObject (xr);
934 Assert.AreEqual (typeof (ColorsWithDC), o.GetType (), "#de5");
935 ColorsWithDC cdc = (ColorsWithDC) o;
936 Assert.AreEqual (ColorsWithDC.Red, o, "#de6");
938 o = ser.ReadObject (xr);
939 Assert.AreEqual (typeof (ColorsWithDC), o.GetType (), "#de5");
940 cdc = (ColorsWithDC) o;
941 Assert.AreEqual (ColorsWithDC.Red, o, "#de6");
942 Assert.AreEqual (XmlNodeType.EndElement, xr.NodeType, "#de6");
943 Assert.AreEqual ("any", xr.LocalName, "#de6");
944 xr.ReadEndElement ();
949 public void DeserializeEmptyNestingDC ()
951 NestingDC dc = Deserialize<NestingDC> (
952 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""></NestingDC>");
954 Assert.IsNotNull (dc, "#A0: The object should not be null.");
955 Assert.IsNull (dc.Field1, "#A1: Field1 should be null.");
956 Assert.IsNull (dc.Field2, "#A2: Field2 should be null.");
958 dc = Deserialize<NestingDC> (
959 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""/>");
961 Assert.IsNotNull (dc, "#B0: The object should not be null.");
962 Assert.IsNull (dc.Field1, "#B1: Field1 should be null.");
963 Assert.IsNull (dc.Field2, "#B2: Field2 should be null.");
965 dc = Deserialize<NestingDC> (
966 @"<NestingDC xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><Field1 i:nil=""true"" /><Field2 i:nil=""true"" /></NestingDC>");
968 Assert.IsNotNull (dc, "#B0: The object should not be null.");
969 Assert.IsNull (dc.Field1, "#B1: Field1 should be null.");
970 Assert.IsNull (dc.Field2, "#B2: Field2 should be null.");
974 [ExpectedException (typeof (SerializationException))]
975 public void DeserializeEmptyDCWithTwoEnums ()
977 Deserialize<DCWithTwoEnums> (
978 @"<DCWithTwoEnums xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><colors i:nil=""true""/><colors2 i:nil=""true""/></DCWithTwoEnums>");
982 [Category ("NotWorking")]
983 public void DeserializeDCWithNullableEnum ()
985 DCWithNullableEnum dc = Deserialize<DCWithNullableEnum> (
986 @"<DCWithNullableEnum xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><colors i:nil=""true""/></DCWithNullableEnum>");
988 Assert.IsNull (dc.colors, "#B1: Field should be null.");
992 public void DeserializeDCWithTwoEnums ()
994 DCWithTwoEnums dc = Deserialize<DCWithTwoEnums> (
995 @"<DCWithTwoEnums xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><colors>Blue</colors><colors2>Green</colors2></DCWithTwoEnums>");
997 Assert.AreEqual (Colors.Blue, dc.colors, "#0");
998 Assert.AreEqual (Colors.Green, dc.colors2, "#1");
1002 public void DeserializerDCArray ()
1004 DCWithEnum [] dcArray = Deserialize<DCWithEnum []> (
1005 @"<ArrayOfDCWithEnum xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><DCWithEnum><_colors>Red</_colors></DCWithEnum><DCWithEnum><_colors>Green</_colors></DCWithEnum></ArrayOfDCWithEnum>");
1007 Assert.AreEqual (2, dcArray.Length, "#N1");
1008 Assert.AreEqual (Colors.Red, dcArray [0].colors, "#N2");
1009 Assert.AreEqual (Colors.Green, dcArray [1].colors, "#N3");
1013 public void DeserializerDCArray2 ()
1016 @"<ArrayOfanyType xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""><anyType xmlns:d2p1=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"" i:type=""d2p1:DCWithEnum""><d2p1:_colors>Red</d2p1:_colors></anyType><anyType xmlns:d2p1=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"" i:type=""d2p1:DCSimple1""><d2p1:Foo>hello</d2p1:Foo></anyType></ArrayOfanyType>";
1018 List<Type> known = new List<Type> ();
1019 known.Add (typeof (DCWithEnum));
1020 known.Add (typeof (DCSimple1));
1021 DataContractSerializer ser = new DataContractSerializer (typeof (object []), known);
1022 XmlReader xr = XmlReader.Create (new StringReader (xml));
1024 object [] dc = (object []) ser.ReadObject (xr);
1025 Assert.AreEqual (2, dc.Length, "#N1");
1026 Assert.AreEqual (typeof (DCWithEnum), dc [0].GetType (), "#N2");
1027 DCWithEnum dc0 = (DCWithEnum) dc [0];
1028 Assert.AreEqual (Colors.Red, dc0.colors, "#N3");
1029 Assert.AreEqual (typeof (DCSimple1), dc [1].GetType (), "#N4");
1030 DCSimple1 dc1 = (DCSimple1) dc [1];
1031 Assert.AreEqual ("hello", dc1.Foo, "#N4");
1035 public void DeserializerDCArray3 ()
1037 int [] intArray = Deserialize<int []> (
1038 @"<ArrayOfint xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/2003/10/Serialization/Arrays""><int>1</int><int>2</int></ArrayOfint>");
1040 Assert.AreEqual (2, intArray.Length, "#N0");
1041 Assert.AreEqual (1, intArray [0], "#N1");
1042 Assert.AreEqual (2, intArray [1], "#N2");
1046 public void ReadObjectNoVerifyObjectName ()
1048 string xml = @"<any><Member1 xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization1"">bar1</Member1><Member1 xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization2"">bar2</Member1><Member1 xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization"">bar</Member1></any>";
1049 VerifyObjectNameTestData res = (VerifyObjectNameTestData)new DataContractSerializer (typeof (VerifyObjectNameTestData))
1050 .ReadObject (XmlReader.Create (new StringReader (xml)), false);
1051 Assert.AreEqual ("bar", res.GetMember());
1055 public void ReadObjectVerifyObjectName ()
1057 string xml = @"<VerifyObjectNameTestData xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><Member1>bar</Member1></VerifyObjectNameTestData>";
1058 VerifyObjectNameTestData res = (VerifyObjectNameTestData)new DataContractSerializer (typeof (VerifyObjectNameTestData))
1059 .ReadObject (XmlReader.Create (new StringReader (xml)));
1060 Assert.AreEqual ("bar", res.GetMember());
1064 [ExpectedException (typeof (SerializationException))]
1065 public void ReadObjectWrongNamespace ()
1067 string xml = @"<VerifyObjectNameTestData xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization2""><Member1>bar</Member1></VerifyObjectNameTestData>";
1068 new DataContractSerializer (typeof (VerifyObjectNameTestData))
1069 .ReadObject (XmlReader.Create (new StringReader (xml)));
1073 public void ReferenceSerialization ()
1075 var dc = new DataContractSerializer (typeof (ReferenceWrapper));
1076 var t = new ReferenceType ();
1077 StringWriter sw = new StringWriter ();
1078 using (var xw = XmlWriter.Create (sw)) {
1079 xw.WriteStartElement ("z", "root", "http://schemas.microsoft.com/2003/10/Serialization/");
1080 dc.WriteObject (xw, new ReferenceWrapper () {T = t, T2 = t});
1081 xw.WriteEndElement ();
1083 string xml = @"<?xml version='1.0' encoding='utf-16'?><z:root xmlns:z='http://schemas.microsoft.com/2003/10/Serialization/'><ReferenceWrapper xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization'><T z:Id='i1'><F>x</F></T><T2 z:Ref='i1' /></ReferenceWrapper></z:root>";
1084 Assert.AreEqual (xml.Replace ('\'', '"'), sw.ToString (), "#1");
1087 using (XmlReader r = XmlReader.Create (new StringReader (xml)))
1089 r.ReadStartElement ();
1090 w = (ReferenceWrapper) dc.ReadObject (r);
1091 r.ReadEndElement ();
1093 Assert.AreEqual (w.T, w.T2, "#2");
1097 public void GenericSerialization ()
1099 var sw = new StringWriter ();
1100 var ser = new DataContractSerializer (typeof (Foo<string,int,int>));
1101 using (var xw = XmlWriter.Create (sw))
1102 ser.WriteObject (xw, new Foo<string,int,int> () {Field = "f"
1104 var s = sw.ToString ();
1106 var ret = (Foo<string,int,int>) ser.ReadObject (XmlReader.Create (new StringReader (s)));
1107 Assert.AreEqual ("f", ret.Field);
1111 public void GenericCollectionSerialization ()
1113 var l = new MyList ();
1116 var ds = new DataContractSerializer (typeof (MyList));
1117 var sw = new StringWriter ();
1118 using (var xw = XmlWriter.Create (sw))
1119 ds.WriteObject (xw, l);
1120 l = (MyList) ds.ReadObject (XmlReader.Create (new StringReader (sw.ToString ())));
1121 Assert.AreEqual (2, l.Count);
1125 public void GenericListOfKeyValuePairSerialization ()
1127 string xml = @"<?xml version='1.0' encoding='utf-16'?><ArrayOfKeyValuePairOfstringstring xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/System.Collections.Generic'><KeyValuePairOfstringstring><key>foo</key><value>bar</value></KeyValuePairOfstringstring></ArrayOfKeyValuePairOfstringstring>".Replace ('\'', '"');
1129 var ds = new DataContractSerializer (typeof (List<KeyValuePair<string,string>>));
1130 var d = new List<KeyValuePair<string,string>> ();
1131 d.Add (new KeyValuePair<string,string> ("foo", "bar"));
1132 var sw = new StringWriter ();
1133 using (var xw = XmlWriter.Create (sw))
1134 ds.WriteObject (xw, d);
1135 Assert.AreEqual (xml, sw.ToString (), "#1");
1136 d = (List<KeyValuePair<string,string>>) ds.ReadObject (XmlReader.Create (new StringReader (xml)));
1137 Assert.AreEqual (1, d.Count, "#2");
1138 Assert.AreEqual ("bar", d [0].Value, "#3");
1142 public void GenericListOfDictionaryEntrySerialization ()
1144 string xml = @"<?xml version='1.0' encoding='utf-16'?><ArrayOfDictionaryEntry xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/System.Collections'><DictionaryEntry><_key xmlns:d3p1='http://www.w3.org/2001/XMLSchema' i:type='d3p1:string'>foo</_key><_value xmlns:d3p1='http://www.w3.org/2001/XMLSchema' i:type='d3p1:string'>bar</_value></DictionaryEntry></ArrayOfDictionaryEntry>".Replace ('\'', '"');
1146 var ds = new DataContractSerializer (typeof (List<DictionaryEntry>));
1147 var d = new List<DictionaryEntry> ();
1148 d.Add (new DictionaryEntry ("foo", "bar"));
1149 var sw = new StringWriter ();
1150 using (var xw = XmlWriter.Create (sw))
1151 ds.WriteObject (xw, d);
1152 Assert.AreEqual (xml, sw.ToString (), "#1");
1153 Assert.IsTrue (sw.ToString ().IndexOf ("i:type") >= 0);
1154 d = (List<DictionaryEntry>) ds.ReadObject (XmlReader.Create (new StringReader (xml)));
1155 Assert.AreEqual (1, d.Count, "#2");
1156 Assert.AreEqual ("bar", d [0].Value, "#3");
1160 public void GenericDictionarySerialization ()
1162 string xml = @"<?xml version='1.0' encoding='utf-16'?><ArrayOfKeyValueOfstringstring xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'><KeyValueOfstringstring><Key>foo</Key><Value>bar</Value></KeyValueOfstringstring></ArrayOfKeyValueOfstringstring>".Replace ('\'', '"');
1164 var ds = new DataContractSerializer (typeof (Dictionary<string,string>));
1165 var d = new Dictionary<string,string> ();
1167 var sw = new StringWriter ();
1168 using (var xw = XmlWriter.Create (sw))
1169 ds.WriteObject (xw, d);
1170 Assert.AreEqual (xml, sw.ToString (), "#1");
1171 d = (Dictionary<string,string>) ds.ReadObject (XmlReader.Create (new StringReader (xml)));
1172 Assert.AreEqual (1, d.Count, "#2");
1173 Assert.AreEqual ("bar", d ["foo"], "#3");
1177 public void HashtableSerialization ()
1179 string xml = @"<?xml version='1.0' encoding='utf-16'?><ArrayOfKeyValueOfanyTypeanyType xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'><KeyValueOfanyTypeanyType><Key xmlns:d3p1='http://www.w3.org/2001/XMLSchema' i:type='d3p1:string'>foo</Key><Value xmlns:d3p1='http://www.w3.org/2001/XMLSchema' i:type='d3p1:string'>bar</Value></KeyValueOfanyTypeanyType></ArrayOfKeyValueOfanyTypeanyType>".Replace ('\'', '"');
1181 var ds = new DataContractSerializer (typeof (Hashtable));
1182 var d = new Hashtable ();
1184 var sw = new StringWriter ();
1185 using (var xw = XmlWriter.Create (sw))
1186 ds.WriteObject (xw, d);
1187 Assert.AreEqual (xml, sw.ToString (), "#1");
1188 d = (Hashtable) ds.ReadObject (XmlReader.Create (new StringReader (xml)));
1189 Assert.AreEqual (1, d.Count, "#2");
1190 Assert.AreEqual ("bar", d ["foo"], "#3");
1194 public void CollectionContarctDictionarySerialization ()
1196 string xml = @"<?xml version='1.0' encoding='utf-16'?><NAME xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='urn:foo'><ITEM><KEY>foo</KEY><VALUE>bar</VALUE></ITEM></NAME>".Replace ('\'', '"');
1198 var ds = new DataContractSerializer (typeof (MyDictionary<string,string>));
1199 var d = new MyDictionary<string,string> ();
1201 var sw = new StringWriter ();
1202 using (var xw = XmlWriter.Create (sw))
1203 ds.WriteObject (xw, d);
1204 Assert.AreEqual (xml, sw.ToString (), "#1");
1205 d = (MyDictionary<string,string>) ds.ReadObject (XmlReader.Create (new StringReader (xml)));
1206 Assert.AreEqual (1, d.Count, "#2");
1207 Assert.AreEqual ("bar", d ["foo"], "#3");
1211 public void SerializeInterfaceCollection ()
1213 var ser = new DataContractSerializer (typeof (InterfaceCollectionType));
1214 var sw = new StringWriter ();
1215 var obj = new InterfaceCollectionType ();
1216 using (var xw = XmlWriter.Create (sw))
1217 ser.WriteObject (xw, obj);
1218 using (var xr = XmlReader.Create (new StringReader (sw.ToString ()))) {
1219 obj = (InterfaceCollectionType) ser.ReadObject (xr);
1220 Assert.IsNull (obj.Array, "#1");
1223 sw = new StringWriter ();
1224 obj.Array = new List<int> ();
1226 using (var xw = XmlWriter.Create (sw))
1227 ser.WriteObject (xw, obj);
1228 using (var xr = XmlReader.Create (new StringReader (sw.ToString ()))) {
1229 obj = (InterfaceCollectionType) ser.ReadObject (xr);
1230 Assert.AreEqual (5, obj.Array [0], "#2");
1235 public void EmptyChildren ()
1238 <DummyPlaylist xmlns='http://example.com/schemas/asx'>
1241 <EntryInfo xmlns:i='http://www.w3.org/2001/XMLSchema-instance' i:type='PartDummyEntryInfo'/>
1242 <Href>http://vmsservices.example.com:8080/VideoService.svc?crid=45541/part=1/guid=ae968b5d-e4a5-41fe-9b23-ed631b27cd21/</Href>
1247 var reader = XmlReader.Create (new StringReader (xml));
1248 DummyPlaylist playlist = (DummyPlaylist) new DataContractSerializer (typeof (DummyPlaylist)).ReadObject (reader);
1249 Assert.AreEqual (1, playlist.entries.Count, "#1");
1250 Assert.IsTrue (playlist.entries [0] is DummyEntry, "#2");
1251 Assert.IsNotNull (playlist.entries [0].Href, "#3");
1255 public void BaseKnownTypeAttributes ()
1259 <DummyPlaylist xmlns='http://example.com/schemas/asx'>
1262 <EntryInfo xmlns:i='http://www.w3.org/2001/XMLSchema-instance' i:type='PartDummyEntryInfo'/>
1267 using (XmlReader reader = XmlReader.Create (new StringReader (xml))) {
1268 DummyPlaylist playlist = new DataContractSerializer(typeof(DummyPlaylist)).ReadObject(reader) as DummyPlaylist;
1269 Assert.IsNotNull (playlist);
1274 public void Bug524083 ()
1277 <AsxEntryInfo xmlns='http://example.com/schemas/asx'>
1281 using (XmlReader reader = XmlReader.Create (new StringReader (xml)))
1282 new DataContractSerializer(typeof (AsxEntryInfo)).ReadObject (reader);
1286 public void Bug539563 ()
1288 new DataContractSerializer (typeof (NestedContractType));
1292 public void Bug560155 ()
1294 var g = Guid.NewGuid ();
1295 Person p1 = new Person ("UserName", g);
1296 Assert.AreEqual ("name=UserName,id=" + g, p1.ToString (), "#1");
1297 MemoryStream memStream = new MemoryStream ();
1298 DataContractSerializer ser = new DataContractSerializer (typeof (Person));
1300 ser.WriteObject (memStream, p1);
1301 memStream.Seek (0, SeekOrigin.Begin);
1302 Person p2 = (Person) ser.ReadObject (memStream);
1303 Assert.AreEqual ("name=UserName,id=" + g, p2.ToString (), "#1");
1306 private T Deserialize<T> (string xml)
1308 return Deserialize<T> (xml, typeof (T));
1311 private T Deserialize<T> (string xml, Type runtimeType)
1313 DataContractSerializer ser = new DataContractSerializer (typeof (T));
1314 XmlReader xr = XmlReader.Create (new StringReader (xml), new XmlReaderSettings ());
1315 object o = ser.ReadObject (xr);
1316 Assert.AreEqual (runtimeType, o.GetType (), "#DS0");
1320 public Dictionary<string, object> GenericDictionary (Dictionary<string, object> settings)
1322 using (MemoryStream ms = new MemoryStream ()) {
1323 DataContractSerializer save = new DataContractSerializer (settings.GetType ());
1324 save.WriteObject (ms, settings);
1328 DataContractSerializer load = new DataContractSerializer (typeof (Dictionary<string, object>));
1329 return (Dictionary<string, object>) load.ReadObject (ms);
1334 public void GenericDictionaryEmpty ()
1336 Dictionary<string, object> in_settings = new Dictionary<string, object> ();
1337 Dictionary<string, object> out_settings = GenericDictionary (in_settings);
1338 out_settings.Clear ();
1342 public void GenericDictionaryOneElement ()
1344 Dictionary<string, object> in_settings = new Dictionary<string, object> ();
1345 in_settings.Add ("one", "ONE");
1346 Dictionary<string, object> out_settings = GenericDictionary (in_settings);
1347 Assert.AreEqual ("ONE", out_settings ["one"], "out");
1348 out_settings.Clear ();
1352 public void IgnoreDataMember ()
1354 var ser = new DataContractSerializer (typeof (MemberIgnored));
1355 var sw = new StringWriter ();
1356 using (var w = XmlWriter.Create (sw, settings)) {
1357 ser.WriteObject (w, new MemberIgnored ());
1359 Assert.AreEqual (@"<MemberIgnored xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/MonoTests.System.Runtime.Serialization""><body><Bar>bar</Bar></body></MemberIgnored>", sw.ToString (), "#1");
1363 public void DeserializeEmptyArray ()
1365 var ds = new DataContractSerializer (typeof (string []));
1366 var sw = new StringWriter ();
1367 var xw = XmlWriter.Create (sw);
1368 ds.WriteObject (xw, new string [] {});
1370 Console.WriteLine (sw.ToString ());
1371 var sr = new StringReader (sw.ToString ());
1372 var xr = XmlReader.Create (sr);
1373 var ret = ds.ReadObject (xr);
1374 Assert.AreEqual (typeof (string []), ret.GetType (), "#1");
1378 public void ContractNamespaceAttribute ()
1380 var ds = new DataContractSerializer (typeof (U2U.DataContracts.Person));
1381 string xml = "<?xml version='1.0' encoding='utf-16'?><Person xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.u2u.be/samples/wcf/2009'><Name>Rupert</Name><Occupation><Description>Monkey</Description></Occupation></Person>";
1382 var person = new U2U.DataContracts.Person () {
1384 Occupation = new U2U.DataContracts.Job () { Description = "Monkey" }
1386 var sw = new StringWriter ();
1387 using (var xw = XmlWriter.Create (sw))
1388 ds.WriteObject (xw, person);
1389 Assert.AreEqual (xml, sw.ToString ().Replace ('"', '\''), "#1");
1393 public void Bug610036 ()
1395 var ms = new MemoryStream ();
1396 Type [] knownTypes = new Type [] { typeof (ParentClass), typeof (Foo), typeof (Bar) };
1398 var ds = new DataContractSerializer (typeof (Root), "Root", "Company.Foo", knownTypes, 1000, false, true, null);
1400 var root = new Root ("root");
1401 var bar1 = new Bar ("bar1");
1402 var bar2 = new Bar ("bar2");
1403 var bar3 = new Bar ("bar3");
1405 var foo1 = new Foo ("foo1");
1406 var foo2 = new Foo ("foo2");
1408 foo1.FDict.Add (bar1);
1409 foo1.FDict.Add (bar2);
1411 foo2.FDict.Add (bar1);
1412 foo2.FDict.Add (bar3);
1414 root.FDict.Add (foo1);
1415 root.FDict.Add (foo2);
1417 ds.WriteObject (ms, root);
1418 string result = Encoding.UTF8.GetString (ms.ToArray ());
1421 root = (Root) ds.ReadObject (ms);
1423 Assert.AreEqual (2, root.FDict.Count, "#1");
1424 int idx = result.IndexOf ("foo1");
1425 Assert.IsTrue (idx >= 0, "#2");
1426 // since "foo1" is stored as z:Ref for string, it must not occur twice.
1427 int idx2 = result.IndexOf ("foo1", idx + 1);
1428 Assert.IsTrue (idx2 < 0, "idx2 should not occur at " + idx2);
1432 public void IXmlSerializableCallConstructor ()
1434 IXmlSerializableCallConstructor (false);
1435 IXmlSerializableCallConstructor (true);
1438 void IXmlSerializableCallConstructor (bool binary)
1440 Stream s = IXmlSerializableCallConstructorSerialize (binary);
1441 var a = new byte [s.Length];
1443 s.Read (a, 0, a.Length);
1445 IXmlSerializableCallConstructorDeserialize (s, binary);
1448 public Stream IXmlSerializableCallConstructorSerialize (bool binary)
1450 var ds = new DataSet ("ds");
1451 var dt = new DataTable ("dt");
1453 dt.Columns.Add ("n", typeof (int));
1454 dt.Columns.Add ("s", typeof (string));
1456 dt.Rows.Add (5, "five");
1457 dt.Rows.Add (10, "ten");
1459 ds.AcceptChanges ();
1461 var s = new MemoryStream ();
1463 var w = binary ? XmlDictionaryWriter.CreateBinaryWriter (s) : XmlDictionaryWriter.CreateTextWriter (s);
1465 var x = new DataContractSerializer (typeof (DataSet));
1466 x.WriteObject (w, ds);
1472 public void IXmlSerializableCallConstructorDeserialize (Stream s, bool binary)
1474 var r = binary ? XmlDictionaryReader.CreateBinaryReader (s, XmlDictionaryReaderQuotas.Max)
1475 : XmlDictionaryReader.CreateTextReader (s, XmlDictionaryReaderQuotas.Max);
1477 var x = new DataContractSerializer (typeof (DataSet));
1479 var ds = (DataSet) x.ReadObject (r);
1484 public class MemberIgnored
1487 MemberIgnoredBody body = new MemberIgnoredBody ();
1490 public class MemberIgnoredBody
1493 public string Foo = "foo";
1495 public string Bar = "bar";
1498 public enum Colors {
1503 public enum Colors2 {
1507 [DataContract (Name = "_ColorsWithDC")]
1508 public enum ColorsWithDC {
1510 [EnumMember (Value = "_Red")]
1518 public enum ColorsEnumMemberNoDC {
1519 [EnumMember (Value = "_Red")]
1527 public class DCWithEnum {
1528 [DataMember (Name = "_colors")]
1529 public Colors colors;
1533 public class DCWithTwoEnums {
1535 public Colors colors;
1537 public Colors colors2;
1541 public class DCWithNullableEnum {
1543 public Colors? colors;
1547 [DataContract (Namespace = "Base")]
1548 public class BaseDC {
1553 [DataContract (Namespace = "Derived")]
1554 public class DerivedDC : BaseDC {
1556 public int derivedVal;
1560 public class NestedDC {
1561 public NestedDC (string name) { this.Name = name; }
1568 public class NestingDC {
1570 public NestedDC Field1;
1572 public NestedDC Field2;
1575 [DataContract (Namespace = "test1")]
1576 public class NestedDC2 {
1577 public NestedDC2 (string name) { this.Name = name; }
1583 [DataContract (Namespace = "test2")]
1584 public class NestingDC2 {
1586 public NestedDC2 Field;
1590 public class DCEmpty
1592 // serializer doesn't touch it.
1593 public string Foo = "TEST";
1596 [DataContract (Namespace = "")]
1597 public class DCEmptyNoNS
1602 public class DCSimple1
1605 public string Foo = "TEST";
1609 public class DCHasNonDC
1612 public NonDC Hoge= new NonDC ();
1617 public string Whee = "whee!";
1621 public class DCHasSerializable
1624 public SimpleSer1 Ser = new SimpleSer1 ();
1627 [DataContract (Name = "Foo")]
1628 public class DCWithName
1630 [DataMember (Name = "FooMember")]
1631 public string DMWithName = "value";
1634 [DataContract (Name = "")]
1635 public class DCWithEmptyName
1639 [DataContract (Name = null)]
1640 public class DCWithNullName
1644 [DataContract (Namespace = "")]
1645 public class DCWithEmptyNamespace
1650 public class SimpleSer1
1652 public string Doh = "doh!";
1654 public string Bah = "bah!";
1657 public class Wrapper
1660 public class DCWrapped
1666 public class CollectionContainer
1668 Collection<string> items = new Collection<string> ();
1671 public Collection<string> Items {
1672 get { return items; }
1676 [CollectionDataContract]
1677 public class DataCollection<T> : Collection<T>
1682 public class DataCollectionContainer
1684 DataCollection<string> items = new DataCollection<string> ();
1687 public DataCollection<string> Items {
1688 get { return items; }
1693 class SerializeNonDCArrayType
1696 public NonDCItem [] IPAddresses = new NonDCItem [0];
1699 public class NonDCItem
1701 public int [] Data { get; set; }
1705 public class VerifyObjectNameTestData
1708 string Member1 = "foo";
1710 public string GetMember() { return Member1; }
1713 [XmlRoot(ElementName = "simple", Namespace = "")]
1714 public class SimpleXml : IXmlSerializable
1716 void IXmlSerializable.ReadXml (XmlReader reader)
1720 void IXmlSerializable.WriteXml (XmlWriter writer)
1724 XmlSchema IXmlSerializable.GetSchema ()
1732 public class ReferenceWrapper
1734 [DataMember (Order = 1)]
1735 public ReferenceType T;
1737 [DataMember (Order = 2)]
1738 public ReferenceType T2;
1741 [DataContract (IsReference = true)]
1742 public class ReferenceType
1745 public string F = "x";
1748 public class MyList : IList<string>
1750 List<string> l = new List<string> ();
1751 public void Clear () { l.Clear (); }
1752 public void Add(string s) { l.Add (s);}
1753 public void Insert(int idx, string s) { l.Insert(idx,s);}
1754 public bool Contains(string s) { return l.Contains(s); }
1755 public IEnumerator<string> GetEnumerator () { return l.GetEnumerator (); }
1756 IEnumerator IEnumerable.GetEnumerator () { return l.GetEnumerator (); }
1757 public bool Remove(string s) { return l.Remove(s); }
1758 public void RemoveAt(int i) { l.RemoveAt (i);}
1759 public void CopyTo (string [] arr, int index) { l.CopyTo (arr, index);}
1760 public int IndexOf (string s) { return l.IndexOf (s); }
1762 public int Count { get { return l.Count; } }
1763 public bool IsReadOnly { get { return ((IList<string>) l).IsReadOnly; } }
1764 public string this [int index] { get { return l [index]; } set { l [index] = value; } }
1768 internal class InterfaceCollectionType
1771 public IList<int> Array { get; set; }
1775 public class NestedContractType
1778 public NestedContractType Nested;
1780 public string X = "x";
1796 [CollectionDataContract (Name = "NAME", Namespace = "urn:foo", ItemName = "ITEM", KeyName = "KEY", ValueName = "VALUE")]
1797 public class MyDictionary<K,V> : Dictionary<K,V>
1802 [DataContract(Namespace="http://example.com/schemas/asx")]
1803 public class DummyEntry
1806 public DummyEntryInfo EntryInfo { get; set; }
1808 public string Href { get; set; }
1811 [DataContract(Namespace="http://example.com/schemas/asx"),
1812 KnownType(typeof(PartDummyEntryInfo))]
1813 public abstract class DummyEntryInfo
1817 [DataContract(Namespace="http://example.com/schemas/asx")]
1818 public class DummyPlaylist
1820 public IList<DummyEntry> entries = new List<DummyEntry> ();
1823 public IList<DummyEntry> Entries { get { return entries; } set {entries = value;} }
1826 [DataContract(Namespace="http://example.com/schemas/asx")]
1827 public class PartDummyEntryInfo : DummyEntryInfo
1829 public PartDummyEntryInfo() {}
1834 [DataContract(Namespace="http://example.com/schemas/asx")]
1835 public class AsxEntryInfo
1838 public string AdvertPrompt { get; set; }
1847 readonly public string name;
1849 readonly public Guid Id = Guid.Empty;
1851 public Person (string nameIn, Guid idIn)
1857 public override string ToString()
1859 return string.Format ("name={0},id={1}", name, Id);
1864 namespace U2U.DataContracts
1870 public string Name { get; set; }
1873 public Job Occupation { get; set; }
1880 public string Description { get; set; }
1885 //parent class with a name property
1886 [DataContract (Namespace = "Company.Foo")]
1887 public abstract class ParentClass
1891 public ParentClass (string name)
1898 public string Name{ get; set; }
1903 [DataContract (Namespace = "Company.Foo")]
1904 public class Root : ParentClass
1908 public Dict<Foo> FDict;
1911 public Root (string name)
1914 FDict = new Dict<Foo> ();
1920 [DataContract (Namespace = "Company.Foo")]
1921 public class Foo : ParentClass
1925 public Dict<Bar> FDict;
1928 public Foo (string name)
1931 FDict = new Dict<Bar> ();
1937 [DataContract (Namespace = "Company.Foo")]
1938 public class Bar : ParentClass
1941 public Bar (string name)
1947 //the custom dictionary
1948 [CollectionDataContract (ItemName = "DictItem", Namespace = "Company.Foo")]
1949 public class Dict<T> : Dictionary<string, T> where T : ParentClass
1951 public void Add (T item)
1953 Add (item.Name, item);