2009-03-10 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Tue, 10 Mar 2009 18:21:07 +0000 (18:21 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Tue, 10 Mar 2009 18:21:07 +0000 (18:21 -0000)
* KnownTypeCollection.cs : fix for generic serialization.

* XmlObjectSerializerTest.cs : test for generic type serialization.

svn path=/trunk/mcs/; revision=129001

mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/ChangeLog
mcs/class/System.Runtime.Serialization/System.Runtime.Serialization/KnownTypeCollection.cs
mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/ChangeLog
mcs/class/System.Runtime.Serialization/Test/System.Runtime.Serialization/XmlObjectSerializerTest.cs

index 98df3c1a43857a185f7c92b6fc079ae5dbef2808..26d9334d301b8d110a69ceb182a20fdc86876cb6 100755 (executable)
@@ -1,3 +1,7 @@
+2009-03-10  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * KnownTypeCollection.cs : fix for generic serialization.
+
 2009-02-27  Atsushi Enomoto  <atsushi@ximian.com>
 
        * SerializationMap.cs : look for unordered members first, in
index f0d1185be5858942825cf98747b8dd97360e6eec..1093b412b2a39de665922dcb23a9ddb4f023bac2 100644 (file)
@@ -451,11 +451,16 @@ namespace System.Runtime.Serialization
 
                internal static QName GetContractQName (Type type, string name, string ns)
                {
-                       if (name == null)
+                       if (name == null) {
                                // FIXME: there could be decent ways to get 
                                // the same result...
                                name = type.Namespace == null || type.Namespace.Length == 0 ? type.Name : type.FullName.Substring (type.Namespace.Length + 1).Replace ('+', '.');
-
+                               if (type.IsGenericType) {
+                                       name = name.Substring (0, name.IndexOf ('`')) + "Of";
+                                       foreach (var t in type.GetGenericArguments ())
+                                               name += t.Name; // FIXME: check namespaces too
+                               }
+                       }
                        if (ns == null)
                                ns = XmlObjectSerializer.DefaultNamespaceBase + type.Namespace;
                        return new QName (name, ns);
@@ -501,6 +506,11 @@ namespace System.Runtime.Serialization
                private QName GetSerializableQName (Type type)
                {
                        string xmlName = type.Name;
+                       if (type.IsGenericType) {
+                               xmlName = xmlName.Substring (0, xmlName.IndexOf ('`')) + "Of";
+                               foreach (var t in type.GetGenericArguments ())
+                                       xmlName += t.Name; // FIXME: check namespaces too
+                       }
                        string xmlNamespace = XmlObjectSerializer.DefaultNamespaceBase + type.Namespace;
                        var x = GetAttribute<XmlRootAttribute> (type);
                        if (x != null) {
index a91d52ef295c945b7f7236d37e04b544c32e51df..47bb48116d284be361ef81b0c8b9100cd65bfa10 100644 (file)
@@ -1,3 +1,7 @@
+2009-03-10  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlObjectSerializerTest.cs : test for generic type serialization.
+
 2009-02-13  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XmlObjectSerializerTest.cs : fixed non-contract serialization
index 06fdf9fd7d37ad582fd06999b7125e05a9cc0b3d..28be4a38264213ebfe8d6a9a395f5335570d7aaa 100644 (file)
@@ -1066,6 +1066,20 @@ namespace MonoTests.System.Runtime.Serialization
                        Assert.AreEqual (w.T, w.T2, "#2");
                }
 
+               [Test]
+               public void GenericSerialization ()
+               {
+                       var sw = new StringWriter ();
+                       var ser  = new DataContractSerializer (typeof (Foo<string,int,int>));
+                       using (var xw = XmlWriter.Create (sw))
+                               ser.WriteObject (xw, new Foo<string,int,int> () {Field = "f"
+                       });
+                       var s = sw.ToString ();
+
+                       var ret = (Foo<string,int,int>) ser.ReadObject (XmlReader.Create (new StringReader (s)));
+                       Assert.AreEqual ("f", ret.Field);
+               }
+
                private T Deserialize<T> (string xml)
                {
                        return Deserialize<T> (xml, typeof (T));
@@ -1321,3 +1335,10 @@ namespace MonoTests.System.Runtime.Serialization
 class GlobalSample1
 {
 }
+
+[DataContract]
+class Foo<X,Y,Z>
+{
+       [DataMember]
+       public X Field;
+}