[runtime] Actually clean up context-static data segments.
[mono.git] / mcs / class / System.ServiceModel.Web / System.Runtime.Serialization.Json / DataContractJsonSerializer.cs
index e9e45c0f732aeaa683318e14e13782cbfcac0c65..8077136394dedb755b886df4689ac4d8d3f71912 100644 (file)
@@ -84,7 +84,17 @@ namespace System.Runtime.Serialization.Json
                                throw new ArgumentOutOfRangeException ("maxItemsInObjectGraph");
 
                        this.type = type;
-                       known_types = new ReadOnlyCollection<Type> (knownTypes != null ? knownTypes.ToArray () : Type.EmptyTypes);
+
+                       var knownTypesFromAttributes = new List<Type> ();
+
+                       foreach (var attr in type.GetCustomAttributes (typeof (KnownTypeAttribute), false))
+                               knownTypesFromAttributes.Add ((attr as KnownTypeAttribute).Type);
+
+                       if (knownTypes != null)
+                               knownTypesFromAttributes.AddRange (knownTypes);
+
+                       known_types = new ReadOnlyCollection<Type> (knownTypesFromAttributes);
+
                        root = rootName;
                        max_items = maxItemsInObjectGraph;
                        ignore_extension = ignoreExtensionDataObject;
@@ -107,6 +117,12 @@ namespace System.Runtime.Serialization.Json
                {
                }
 
+               public DataContractJsonSerializer (Type type, DataContractJsonSerializerSettings settings)
+                       : this (type, settings.RootName, settings.KnownTypes, settings.MaxItemsInObjectGraph, settings.IgnoreExtensionDataObject,
+                               settings.DataContractSurrogate, false)
+               {
+               }
+
         #endregion
 
         Type type;
@@ -126,8 +142,6 @@ namespace System.Runtime.Serialization.Json
                public bool IgnoreExtensionDataObject {
                        get { return ignore_extension; }
                }
-
-               [MonoTODO]
                public ReadOnlyCollection<Type> KnownTypes {
                        get { return known_types; }
                }
@@ -186,6 +200,10 @@ namespace System.Runtime.Serialization.Json
                                return new JsonSerializationReader (this, reader, type, verifyObjectName).ReadRoot ();
                        } catch (SerializationException) {
                                throw;
+                       } catch (InvalidDataContractException) {
+                               throw;
+                       } catch (System.Reflection.TargetInvocationException ex) {
+                               throw ex.InnerException;
                        } catch (Exception ex) {
                                throw new SerializationException ("Deserialization has failed", ex);
                        }
@@ -250,5 +268,26 @@ namespace System.Runtime.Serialization.Json
                                throw new ArgumentNullException ("writer");
                        writer.WriteEndElement ();
                }
+
+               [MonoTODO]
+               public DateTimeFormat DateTimeFormat {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public EmitTypeInformation EmitTypeInformation {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public bool SerializeReadOnlyTypes {
+                       get { throw new NotImplementedException (); }
+               }
+
+               [MonoTODO]
+               public bool UseSimpleDictionaryFormat {
+                       get { throw new NotImplementedException (); }
+               }
+
        }
 }