+ [Test]
+ public void DeserializeEmptyArray ()
+ {
+ var ds = new DataContractSerializer (typeof (string []));
+ var sw = new StringWriter ();
+ var xw = XmlWriter.Create (sw);
+ ds.WriteObject (xw, new string [] {});
+ xw.Close ();
+ Console.WriteLine (sw.ToString ());
+ var sr = new StringReader (sw.ToString ());
+ var xr = XmlReader.Create (sr);
+ var ret = ds.ReadObject (xr);
+ Assert.AreEqual (typeof (string []), ret.GetType (), "#1");
+ }
+
+ [Test]
+ public void ContractNamespaceAttribute ()
+ {
+ var ds = new DataContractSerializer (typeof (U2U.DataContracts.Person));
+ 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>";
+ var person = new U2U.DataContracts.Person () {
+ Name = "Rupert",
+ Occupation = new U2U.DataContracts.Job () { Description = "Monkey" }
+ };
+ var sw = new StringWriter ();
+ using (var xw = XmlWriter.Create (sw))
+ ds.WriteObject (xw, person);
+ Assert.AreEqual (xml, sw.ToString ().Replace ('"', '\''), "#1");
+ }
+
+ [Test]
+ public void Bug610036 ()
+ {
+ var ms = new MemoryStream ();
+ Type [] knownTypes = new Type [] { typeof (ParentClass), typeof (Foo), typeof (Bar) };
+
+ var ds = new DataContractSerializer (typeof (Root), "Root", "Company.Foo", knownTypes, 1000, false, true, null);
+
+ var root = new Root ("root");
+ var bar1 = new Bar ("bar1");
+ var bar2 = new Bar ("bar2");
+ var bar3 = new Bar ("bar3");
+
+ var foo1 = new Foo ("foo1");
+ var foo2 = new Foo ("foo2");
+
+ foo1.FDict.Add (bar1);
+ foo1.FDict.Add (bar2);
+
+ foo2.FDict.Add (bar1);
+ foo2.FDict.Add (bar3);
+
+ root.FDict.Add (foo1);
+ root.FDict.Add (foo2);
+
+ ds.WriteObject (ms, root);
+ string result = Encoding.UTF8.GetString (ms.ToArray ());
+ ms.Position = 0;
+
+ root = (Root) ds.ReadObject (ms);
+
+ Assert.AreEqual (2, root.FDict.Count, "#1");
+ int idx = result.IndexOf ("foo1");
+ Assert.IsTrue (idx >= 0, "#2");
+ // since "foo1" is stored as z:Ref for string, it must not occur twice.
+ int idx2 = result.IndexOf ("foo1", idx + 1);
+ Assert.IsTrue (idx2 < 0, "idx2 should not occur at " + idx2);
+ }
+
+ [Test]
+ public void AncestralReference ()
+ {
+ // Reference to Parent comes inside the Parent itself.
+ // In this case, adding reference after complete deserialization won't work (but it should).
+ var ms = new MemoryStream ();
+ Type [] knownTypes = new Type [] { typeof (ParentClass), typeof (Foo), typeof (Bar) };
+
+ var ds = new DataContractSerializer (typeof (Parent));
+
+ var org = new Parent ();
+ ds.WriteObject (ms, org);
+ string result = Encoding.UTF8.GetString (ms.ToArray ());
+ ms.Position = 0;
+
+ var parent = (Parent) ds.ReadObject (ms);
+
+ Assert.IsNotNull (parent.Child, "#1");
+ Assert.AreEqual (parent, parent.Child.Parent, "#2");
+ }
+
+ [Test]
+ public void IXmlSerializableCallConstructor ()
+ {
+ IXmlSerializableCallConstructor (false);
+ IXmlSerializableCallConstructor (true);
+ }
+
+ void IXmlSerializableCallConstructor (bool binary)
+ {
+ Stream s = IXmlSerializableCallConstructorSerialize (binary);
+ var a = new byte [s.Length];
+ s.Position = 0;
+ s.Read (a, 0, a.Length);
+ s.Position = 0;
+ IXmlSerializableCallConstructorDeserialize (s, binary);
+ }
+
+ public Stream IXmlSerializableCallConstructorSerialize (bool binary)
+ {
+ var ds = new DataSet ("ds");
+ var dt = new DataTable ("dt");
+ ds.Tables.Add (dt);
+ dt.Columns.Add ("n", typeof (int));
+ dt.Columns.Add ("s", typeof (string));
+
+ dt.Rows.Add (5, "five");
+ dt.Rows.Add (10, "ten");
+
+ ds.AcceptChanges ();
+
+ var s = new MemoryStream ();
+
+ var w = binary ? XmlDictionaryWriter.CreateBinaryWriter (s) : XmlDictionaryWriter.CreateTextWriter (s);
+
+ var x = new DataContractSerializer (typeof (DataSet));
+ x.WriteObject (w, ds);
+ w.Flush ();
+
+ return s;
+ }
+
+ public void IXmlSerializableCallConstructorDeserialize (Stream s, bool binary)
+ {
+ var r = binary ? XmlDictionaryReader.CreateBinaryReader (s, XmlDictionaryReaderQuotas.Max)
+ : XmlDictionaryReader.CreateTextReader (s, XmlDictionaryReaderQuotas.Max);
+
+ var x = new DataContractSerializer (typeof (DataSet));
+
+ var ds = (DataSet) x.ReadObject (r);
+ }
+
+ [Test]
+ [ExpectedException (typeof (InvalidDataContractException))] // BaseConstraintType1 is neither DataContract nor Serializable.
+ public void BaseConstraint1 ()
+ {
+ new DataContractSerializer (typeof (BaseConstraintType3)).WriteObject (XmlWriter.Create (TextWriter.Null), new BaseConstraintType3 ());
+ }
+
+ [Test]
+ public void BaseConstraint2 ()
+ {
+ new DataContractSerializer (typeof (BaseConstraintType4)).WriteObject (XmlWriter.Create (TextWriter.Null), new BaseConstraintType4 ());
+ }
+
+ [Test] // bug #652331
+ public void MembersNamespacesInBaseType ()
+ {
+ string xml1 = @"<Currency>JPY</Currency><Description i:nil=""true"" />";
+ string xml2 = @"<Currency xmlns=""http://schemas.datacontract.org/2004/07/SLProto5"">JPY</Currency><Description i:nil=""true"" xmlns=""http://schemas.datacontract.org/2004/07/SLProto5"" />";
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5.CashAmount> (new SLProto5.CashAmount () { Currency = "JPY" }, xml1, "#1").Currency, "r#1");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5_Different.CashAmount> (new SLProto5_Different.CashAmount () { Currency = "JPY" }, xml2, "#2").Currency, "r#2");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5.CashAmountDC> (new SLProto5.CashAmountDC () { Currency = "JPY" }, xml1, "#3").Currency, "r#3");
+ Assert.AreEqual ("JPY", MembersNamespacesInBaseType_Part<SLProto5_Different.CashAmountDC> (new SLProto5_Different.CashAmountDC () { Currency = "JPY" }, xml2, "#4").Currency, "r#4");
+ }
+
+ T MembersNamespacesInBaseType_Part<T> (T instance, string expectedPart, string assert)
+ {
+ var ds = new DataContractSerializer (typeof (T));
+ var sw = new StringWriter ();
+ using (var w = XmlWriter.Create (sw))
+ ds.WriteObject (w, instance);
+ Assert.IsTrue (sw.ToString ().IndexOf (expectedPart) > 0, assert);
+ return (T) ds.ReadObject (XmlReader.Create (new StringReader (sw.ToString ())));
+ }
+
+ [Test]
+ public void DateTimeOffsetSerialization ()
+ {
+ var ds = new DataContractSerializer (typeof (DateTimeOffset));
+ var sw = new StringWriter ();
+ string xml = "<DateTimeOffset xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.datacontract.org/2004/07/System'><DateTime>2011-03-01T02:05:06.078Z</DateTime><OffsetMinutes>120</OffsetMinutes></DateTimeOffset>".Replace ('\'', '"');
+
+ var v = new DateTimeOffset (new DateTime (2011, 3, 1, 4, 5, 6, 78), TimeSpan.FromMinutes (120));
+ using (var xw = XmlWriter.Create (sw, settings)) {
+ ds.WriteObject (xw, v);
+ }
+ Assert.AreEqual (xml, sw.ToString (), "#1");
+ Assert.AreEqual (v, ds.ReadObject (XmlReader.Create (new StringReader (sw.ToString ()))), "#2");
+ }
+
+ [Test]
+ public void DateTimeOffsetNullableSerialization ()
+ {
+ var ds = new DataContractSerializer (typeof (DateTimeOffset?));
+ var sw = new StringWriter ();
+ string xml = "<DateTimeOffset xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.datacontract.org/2004/07/System\"><DateTime>2012-05-04T00:34:00Z</DateTime><OffsetMinutes>120</OffsetMinutes></DateTimeOffset>";
+
+ var v = new DateTimeOffset (new DateTime (2012, 05, 04, 02, 34, 0), TimeSpan.FromMinutes (120));
+ using (var xw = XmlWriter.Create (sw, settings)) {
+ ds.WriteObject (xw, v);
+ }
+ Assert.AreEqual (xml, sw.ToString (), "#1");
+ Assert.AreEqual (v, ds.ReadObject (XmlReader.Create (new StringReader (sw.ToString ()))), "#2");
+ }
+
+ [Test]
+ public void XmlDocumentSupport ()
+ {
+ var xml = "<XmlDocumentContract xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='urn:foo'><Content><Root xmlns=''>Hello, world!</Root></Content><Nodes><child1 xmlns='' /><child2 xmlns='' /></Nodes></XmlDocumentContract>".Replace ('\'', '"');
+ var xml2 = "<Root>Hello, world!</Root>";
+ var obj = new XmlDocumentContract ();
+ var doc = new XmlDocument ();
+ doc.LoadXml (xml2);
+ obj.Content = doc.DocumentElement;
+ doc = new XmlDocument ();
+ doc.LoadXml ("<root><child1/><child2/></root>");
+ var l = new List<XmlNode> ();
+ foreach (XmlNode node in doc.DocumentElement.ChildNodes)
+ l.Add (node);
+ obj.Nodes = l.ToArray ();
+ var serializer = new DataContractSerializer (typeof (XmlDocumentContract))
+ ;
+ var sb = new StringBuilder ();
+ using (var writer = new StringWriter (sb))
+ serializer.WriteObject (new XmlTextWriter (writer), obj);
+ Assert.AreEqual (xml, sb.ToString (), "#1");
+ using (var reader = new StringReader (sb.ToString ()))
+ obj = serializer.ReadObject (new XmlTextReader (reader)) as XmlDocumentContract;
+ Assert.AreEqual ("Hello, world!", obj.Content != null ? obj.Content.InnerText : String.Empty, "#2");
+ Assert.AreEqual (2, obj.Nodes != null ? obj.Nodes.Length : -1, "#3");
+ }
+
+ [Test]
+ public void ArrayAsEnumerableAsRoot ()
+ {
+ var ds = new DataContractSerializer (typeof (IEnumerable<Guid>));
+ var sw = new StringWriter ();
+ using (var xw = XmlWriter.Create (sw, settings))
+ ds.WriteObject (xw, new Guid [] {Guid.Empty});
+ string xml = "<ArrayOfguid xmlns:i='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'><guid>00000000-0000-0000-0000-000000000000</guid></ArrayOfguid>".Replace ('\'', '"');
+ Assert.AreEqual (xml, sw.ToString (), "#1");
+ }
+
+ // bug #7957
+ [Test]
+ public void DeserializeEmptyDictionary ()
+ {
+ string whatItGets = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+ + "<MyData xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://sickhead.com/types/Example\">"
+ + "<Data xmlns:b=\"http://schemas.microsoft.com/2003/10/Serialization/Arrays\"/>"
+ + "<FirstId>b8a7eb6f-f593-4668-8178-07be9f7266d1</FirstId>"
+ + "<SecondId>ID-GOES-HERE</SecondId>"
+ + "</MyData>";
+ var serializer = new DataContractSerializer (typeof (MyData));
+ using (var stream = new MemoryStream (Encoding.UTF8.GetBytes (whatItGets)))
+ {
+ var data = serializer.ReadObject (stream);
+ }
+ }
+ }
+