From ffad8df117e4077d39268902c8f9641e1d5d8f0f Mon Sep 17 00:00:00 2001 From: Ivan Zlatev Date: Sat, 1 Mar 2008 23:12:56 +0000 Subject: [PATCH] 2008-03-01 Ivan N. Zlatev * CodeDomSerializerBase.cs, PropertyCodeDomSerializer.cs: PropertySerializer shouldn't check for serialization visibility as its duty is to serialize properies if invoked directly. CodeDomSerializerBase.SerializeProperties should check the visibility. * CodeDomSerializer.cs: Fix deserialize to deserialize all statements. * CodeDomDesignerLoader.cs: Implement IDesignerSerializationService using the ComponentSerializationService instead of calling ourselves recursive. * CodeDomComponentSerializationService.cs: A lot of bugfixes. * DesignerSerializationManager.cs: - Verify that we are not in session before creating a new one. - Do not check whether we should preserve names in GetInstance. This is only for CreateInstance. - Fix a NRE if serialization providers are not initialized. * CodeDomSerializationProvider.cs, CodeDomDesignerLoader.cs: Refactor the codedom provider to a singleton, so that CodeDomComponentSerializationService and others can share the instance. * SerializeAbsoluteContext.cs: ShouldSerialize should check if the absolute context is of the same member not the opposite. svn path=/trunk/mcs/; revision=97101 --- .../Changelog | 25 ++ .../CodeDomComponentSerializationService.cs | 320 +++++++++++------- .../CodeDomDesignerLoader.cs | 26 +- .../CodeDomSerializationProvider.cs | 11 + .../CodeDomSerializer.cs | 26 +- .../CodeDomSerializerBase.cs | 13 +- .../DesignerSerializationManager.cs | 15 +- .../PropertyCodeDomSerializer.cs | 16 +- .../SerializeAbsoluteContext.cs | 2 +- 9 files changed, 285 insertions(+), 169 deletions(-) diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog index f3948a5603add..4d83d7e15f450 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/Changelog @@ -1,3 +1,28 @@ +2008-03-01 Ivan N. Zlatev + + * CodeDomSerializerBase.cs, PropertyCodeDomSerializer.cs: + PropertySerializer shouldn't check for serialization visibility + as its duty is to serialize properies if invoked directly. + CodeDomSerializerBase.SerializeProperties should check the + visibility. + * CodeDomSerializer.cs: Fix deserialize to deserialize all + statements. + * CodeDomDesignerLoader.cs: Implement IDesignerSerializationService + using the ComponentSerializationService instead of calling + ourselves recursive. + * CodeDomComponentSerializationService.cs: A lot of bugfixes. + * DesignerSerializationManager.cs: + - Verify that we are not in session before creating a new one. + - Do not check whether we should + preserve names in GetInstance. This is only for CreateInstance. + - Fix a NRE if serialization providers are not initialized. + * CodeDomSerializationProvider.cs, CodeDomDesignerLoader.cs: + Refactor the codedom provider to a singleton, so that + CodeDomComponentSerializationService and others can share the + instance. + * SerializeAbsoluteContext.cs: ShouldSerialize should check if + the absolute context is of the same member not the opposite. + 2008-01-04 Ivan N. Zlatev * CodeDomComponentSerializationService.cs: implemented. diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomComponentSerializationService.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomComponentSerializationService.cs index 358e6e20f9401..f59420e300843 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomComponentSerializationService.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomComponentSerializationService.cs @@ -46,16 +46,13 @@ namespace System.ComponentModel.Design.Serialization public sealed class CodeDomComponentSerializationService : ComponentSerializationService { [Serializable] - private class CodeDomSerializationStore : SerializationStore + private class CodeDomSerializationStore : SerializationStore, ISerializable { - [Serializable] private class Entry { private bool _isSerialized; private object _serialized; - private object _deserialized; - private bool _isDeserialized; private bool _absolute; private string _name; @@ -68,7 +65,6 @@ public Entry (string name) if (name == null) throw new ArgumentNullException ("name"); _name = name; - _isDeserialized = true; _isSerialized = false; _absolute = false; } @@ -86,19 +82,6 @@ public Entry (string name) } } - public bool IsDeserialized { - get { return _isDeserialized; } - set { _isDeserialized = value; } - } - - public object Deserialized { - get { return _deserialized; } - set { - _deserialized = value; - _isDeserialized = true; - } - } - public bool Absolute { get { return _absolute; } set { _absolute = value; } @@ -177,12 +160,126 @@ public ObjectEntry (object instance, string name) : base (name) set { _members = value; } } - public bool EntireObject { + public bool IsEntireObject { get { return _entireObject; } set { _entireObject = value; } } } + // When e.g Copy->Pasting a component will not be preserved, but the serialized + // data will contain references to the original component name. We handle this + // here by checking whether CreateInstance returns a component with a different + // name and we map the old name to the new one so that GetInstance will return + // a reference to the new component. + // + private class InstanceRedirectorDesignerSerializationManager : IDesignerSerializationManager, IServiceProvider + { + DesignerSerializationManager _manager; + private Dictionary _nameMap; + + public InstanceRedirectorDesignerSerializationManager (IServiceProvider provider, IContainer container, + bool validateRecycledTypes) + { + if (provider == null) + throw new ArgumentNullException ("provider"); + DesignerSerializationManager manager = new DesignerSerializationManager (provider); + manager.PreserveNames = false; + if (container != null) + manager.Container = container; + manager.ValidateRecycledTypes = validateRecycledTypes; + _manager = manager; + } + + public IDisposable CreateSession () + { + return _manager.CreateSession (); + } + + public IList Errors { + get { return _manager.Errors; } + } + + object IServiceProvider.GetService (Type service) + { + return ((IServiceProvider)_manager).GetService (service); + } + + #region IDesignerSerializationManager Wrapper Implementation + + void IDesignerSerializationManager.AddSerializationProvider (IDesignerSerializationProvider provider) + { + ((IDesignerSerializationManager)_manager).AddSerializationProvider (provider); + } + + void IDesignerSerializationManager.RemoveSerializationProvider (IDesignerSerializationProvider provider) + { + ((IDesignerSerializationManager)_manager).RemoveSerializationProvider (provider); + } + + object IDesignerSerializationManager.CreateInstance (Type type, ICollection arguments, string name, bool addToContainer) + { + object instance = ((IDesignerSerializationManager)_manager).CreateInstance (type, arguments, name, addToContainer); + string newName = ((IDesignerSerializationManager)_manager).GetName (instance); + if (newName != name) { + if (_nameMap == null) + _nameMap = new Dictionary (); + _nameMap[name] = newName; + } + return instance; + } + + object IDesignerSerializationManager.GetInstance (string name) + { + if (_nameMap != null && _nameMap.ContainsKey (name)) + return ((IDesignerSerializationManager)_manager).GetInstance (_nameMap[name]); + return ((IDesignerSerializationManager)_manager).GetInstance (name); + } + + Type IDesignerSerializationManager.GetType (string name) + { + return ((IDesignerSerializationManager)_manager).GetType (name); + } + + object IDesignerSerializationManager.GetSerializer (Type type, Type serializerType) + { + return ((IDesignerSerializationManager)_manager).GetSerializer (type, serializerType); + } + + string IDesignerSerializationManager.GetName (object instance) + { + return ((IDesignerSerializationManager)_manager).GetName (instance); + } + + void IDesignerSerializationManager.SetName (object instance, string name) + { + ((IDesignerSerializationManager)_manager).SetName (instance, name); + } + + void IDesignerSerializationManager.ReportError (object error) + { + ((IDesignerSerializationManager)_manager).ReportError (error); + } + + ContextStack IDesignerSerializationManager.Context { + get { return ((IDesignerSerializationManager)_manager).Context; } + } + + PropertyDescriptorCollection IDesignerSerializationManager.Properties { + get { return ((IDesignerSerializationManager)_manager).Properties; } + } + + event EventHandler IDesignerSerializationManager.SerializationComplete { + add { ((IDesignerSerializationManager)_manager).SerializationComplete += value; } + remove { ((IDesignerSerializationManager)_manager).SerializationComplete -= value; } + } + + event ResolveNameEventHandler IDesignerSerializationManager.ResolveName { + add { ((IDesignerSerializationManager)_manager).ResolveName += value; } + remove { ((IDesignerSerializationManager)_manager).ResolveName -= value; } + } + #endregion + } // InstanceRedirectorDesignerSerializationManager + private bool _closed; private Dictionary _objects; private IServiceProvider _provider; @@ -197,6 +294,18 @@ internal CodeDomSerializationStore (IServiceProvider provider) _provider = provider; } + private CodeDomSerializationStore (SerializationInfo info, StreamingContext context) + { + _objects = (Dictionary) info.GetValue ("objects", typeof (Dictionary)); + _closed = (bool) info.GetValue ("closed", typeof (bool)); + } + + void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context) + { + info.AddValue ("objects", _objects); + info.AddValue ("closed", _closed); + } + public override void Close () { if (!_closed) { @@ -218,49 +327,52 @@ public override void Save (Stream stream) private void Serialize (IServiceProvider provider) { - if (provider == null) - return; - DesignerSerializationManager manager = provider.GetService (typeof (IDesignerSerializationManager)) as DesignerSerializationManager; - if (manager == null) + if (provider == null || _objects == null) return; - using (IDisposable session = manager.CreateSession ()) { - foreach (ObjectEntry objectEntry in _objects.Values) { - if (objectEntry.EntireObject) { - CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, - typeof (CodeDomSerializer)); + // Use a new serialization manager to prevent from "deadlocking" the surface one + // by trying to create new session when one currently exists + // + InstanceRedirectorDesignerSerializationManager manager = + new InstanceRedirectorDesignerSerializationManager (provider, null, false); + ((IDesignerSerializationManager)manager).AddSerializationProvider (CodeDomSerializationProvider.Instance); + IDisposable session = manager.CreateSession (); + foreach (ObjectEntry objectEntry in _objects.Values) { + if (objectEntry.IsEntireObject) { + CodeDomSerializer serializer = (CodeDomSerializer) ((IDesignerSerializationManager)manager).GetSerializer (objectEntry.Type, + typeof (CodeDomSerializer)); + if (serializer != null) { + object serialized = null; + if (objectEntry.Absolute) + serialized = serializer.SerializeAbsolute (manager, + objectEntry.Instance); + else + serialized = serializer.Serialize (manager, objectEntry.Instance); + objectEntry.Serialized = serialized; + } + } else { + foreach (MemberEntry memberEntry in objectEntry.Members.Values) { + CodeDomSerializer serializer = (CodeDomSerializer) ((IDesignerSerializationManager)manager).GetSerializer ( + objectEntry.Type, typeof (CodeDomSerializer)); if (serializer != null) { object serialized = null; - if (objectEntry.Absolute) - serialized = serializer.SerializeAbsolute (manager, objectEntry.Instance); - else - serialized = serializer.Serialize (manager, objectEntry.Instance); - if (serialized != null) - objectEntry.Serialized = serialized; - } - } else { - foreach (MemberEntry memberEntry in objectEntry.Members.Values) { - CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer ( - objectEntry.Type, typeof (CodeDomSerializer)); - if (serializer != null) { - object serialized = null; - if (memberEntry.Absolute) { - serialized = serializer.SerializeMemberAbsolute (manager, - objectEntry.Instance, - memberEntry.Descriptor); - } else { - serialized = serializer.SerializeMember (manager, - objectEntry.Instance, - memberEntry.Descriptor); - } - if (serialized != null) - memberEntry.Serialized = serialized; + if (memberEntry.Absolute) { + serialized = serializer.SerializeMemberAbsolute (manager, + objectEntry.Instance, + memberEntry.Descriptor); + } else { + serialized = serializer.SerializeMember (manager, + objectEntry.Instance, + memberEntry.Descriptor); } + memberEntry.Serialized = serialized; } } } _errors = manager.Errors; } + _errors = manager.Errors; + session.Dispose (); } internal void AddObject (object instance, bool absolute) @@ -275,7 +387,7 @@ internal void AddObject (object instance, bool absolute) if (!_objects.ContainsKey (objectName)) { ObjectEntry objectEntry = new ObjectEntry (instance, objectName); objectEntry.Absolute = absolute; - objectEntry.EntireObject = true; + objectEntry.IsEntireObject = true; _objects[objectName] = objectEntry; } } @@ -291,23 +403,23 @@ internal void AddMember (object owner, MemberDescriptor member, bool absolute) if (_objects == null) _objects = new Dictionary (); - string objectName = GetName (owner); - if (!_objects.ContainsKey (objectName)) { - ObjectEntry objectEntry = new ObjectEntry (owner, objectName); - MemberEntry memberEntry = new MemberEntry (member); - memberEntry.Absolute = absolute; - objectEntry.Members[member.Name] = memberEntry; - _objects[objectName] = objectEntry; - } + string objectName = GetName (owner); + if (!_objects.ContainsKey (objectName)) + _objects.Add (objectName, new ObjectEntry (owner, objectName)); + MemberEntry memberEntry = new MemberEntry (member); + memberEntry.Absolute = absolute; + _objects[objectName].Members[member.Name] = memberEntry; } private string GetName (object value) { + if (value == null) + throw new ArgumentNullException ("value"); string name = null; IComponent component = value as IComponent; - if (component != null) { + if (component != null && component.Site != null) { if (component.Site is INestedSite) name = ((INestedSite)component.Site).FullName; else @@ -326,77 +438,45 @@ private string GetName (object value) { List objectInstances = new List (); - if (provider == null) + if (provider == null || _objects == null) return objectInstances; _provider = provider; - DesignerSerializationManager manager = provider.GetService - (typeof (IDesignerSerializationManager)) as DesignerSerializationManager; - if (manager == null) - return objectInstances; - - bool validateRecycleBackup = manager.ValidateRecycledTypes; - IContainer containerBackup = manager.Container; - - if (container != null) - manager.Container = container; - - using (IDisposable session = manager.CreateSession ()) { - ((IDesignerSerializationManager) manager).ResolveName += OnResolveInstance; - foreach (ObjectEntry entry in _objects.Values) - objectInstances.Add (DeserializeEntry (manager, entry)); - ((IDesignerSerializationManager) manager).ResolveName -= OnResolveInstance; - _errors = manager.Errors; - } - - manager.ValidateRecycledTypes = validateRecycleBackup; - manager.Container = containerBackup; + // Use a new serialization manager to prevent from "deadlocking" the surface one + // by trying to create new session when one currently exists + // + InstanceRedirectorDesignerSerializationManager manager = + new InstanceRedirectorDesignerSerializationManager (provider, container, validateRecycledTypes); + ((IDesignerSerializationManager)manager).AddSerializationProvider (CodeDomSerializationProvider.Instance); + IDisposable session = manager.CreateSession (); + foreach (ObjectEntry entry in _objects.Values) + objectInstances.Add (DeserializeEntry (manager, entry)); + _errors = manager.Errors; + session.Dispose (); return objectInstances; } - private void OnResolveInstance (object sender, ResolveNameEventArgs args) - { - if (args.Value == null && _objects != null && _objects.ContainsKey (args.Name)) { - IDesignerSerializationManager manager = _provider.GetService - (typeof (IDesignerSerializationManager)) as IDesignerSerializationManager; - if (manager != null) { - ObjectEntry entry = _objects[args.Name]; - if (entry.EntireObject) - args.Value = DeserializeEntry (manager, entry); - } - } - } - private object DeserializeEntry (IDesignerSerializationManager manager, ObjectEntry objectEntry) { object deserialized = null; - if (objectEntry.EntireObject) { - if (objectEntry.IsDeserialized) { - deserialized = objectEntry.Deserialized; - } else { - CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, - typeof (CodeDomSerializer)); - if (serializer != null) { - deserialized = serializer.Deserialize (manager, objectEntry.Serialized); - objectEntry.Deserialized = deserialized; - // check if the name of the object has changed - // (if it e.g clashes with another name) - string newName = manager.GetName (deserialized); - if (newName != objectEntry.Name) - objectEntry.Name = newName; - } + if (objectEntry.IsEntireObject) { + CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, + typeof (CodeDomSerializer)); + if (serializer != null) { + deserialized = serializer.Deserialize (manager, objectEntry.Serialized); + // check if the name of the object has changed + // (if it e.g clashes with another name) + string newName = manager.GetName (deserialized); + if (newName != objectEntry.Name) + objectEntry.Name = newName; } } else { foreach (MemberEntry memberEntry in objectEntry.Members.Values) { - if (!memberEntry.IsDeserialized) { - CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, - typeof (CodeDomSerializer)); - if (serializer != null) { - serializer.Deserialize (manager, memberEntry.Serialized); - memberEntry.IsDeserialized = true; - } - } + CodeDomSerializer serializer = (CodeDomSerializer) manager.GetSerializer (objectEntry.Type, + typeof (CodeDomSerializer)); + if (serializer != null) + serializer.Deserialize (manager, memberEntry.Serialized); } } diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomDesignerLoader.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomDesignerLoader.cs index 73659e09fb1ad..6da3d9168a8d2 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomDesignerLoader.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomDesignerLoader.cs @@ -56,7 +56,7 @@ protected override void Initialize () CodeDomComponentSerializationService (base.LoaderHost)); IDesignerSerializationManager manager = base.LoaderHost.GetService (typeof (IDesignerSerializationManager)) as IDesignerSerializationManager; if (manager != null) - manager.AddSerializationProvider (new CodeDomSerializationProvider ()); + manager.AddSerializationProvider (CodeDomSerializationProvider.Instance); } protected override bool IsReloadNeeded () @@ -256,17 +256,29 @@ void INameCreationService.ValidateName (string name) ICollection IDesignerSerializationService.Deserialize (object serializationData) { - IDesignerSerializationService service = LoaderHost.GetService (typeof (IDesignerSerializationService)) as IDesignerSerializationService; - if (service != null) - return service.Deserialize (serializationData); + if (serializationData == null) + throw new ArgumentNullException ("serializationData"); + + ComponentSerializationService service = LoaderHost.GetService (typeof (ComponentSerializationService)) as ComponentSerializationService; + SerializationStore store = serializationData as SerializationStore; + if (service != null && serializationData != null) + return service.Deserialize (store, this.LoaderHost.Container); return new object[0]; } object IDesignerSerializationService.Serialize (ICollection objects) { - IDesignerSerializationService service = LoaderHost.GetService (typeof (IDesignerSerializationService)) as IDesignerSerializationService; - if (service != null) - return service.Serialize (objects); + if (objects == null) + throw new ArgumentNullException ("objects"); + + ComponentSerializationService service = LoaderHost.GetService (typeof (ComponentSerializationService)) as ComponentSerializationService; + if (service != null) { + SerializationStore store = service.CreateStore (); + foreach (object o in objects) + service.Serialize (store, o); + store.Close (); + return store; + } return null; } #endregion diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializationProvider.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializationProvider.cs index 8bbd54835e9c3..97be7b625f4fa 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializationProvider.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializationProvider.cs @@ -42,6 +42,17 @@ namespace System.ComponentModel.Design.Serialization // internal class CodeDomSerializationProvider : IDesignerSerializationProvider { + + private static CodeDomSerializationProvider _instance = null; + + public static CodeDomSerializationProvider Instance { + get { + if (_instance == null) + _instance = new CodeDomSerializationProvider (); + return _instance; + } + } + public CodeDomSerializationProvider () { _componentSerializer = new ComponentCodeDomSerializer (); diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializer.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializer.cs index bcd20768fa808..b4383a7ae4782 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializer.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializer.cs @@ -127,8 +127,6 @@ public virtual string GetTargetComponentName (CodeStatement statement, CodeExpre if (member is EventDescriptor) base.SerializeEvent (manager, statements, owningobject, (EventDescriptor) member); - manager.Context.Pop (); - return statements; } @@ -168,30 +166,24 @@ public virtual object Deserialize (IDesignerSerializationManager manager, object if (deserialized == null) deserialized = DeserializeStatementToInstance (manager, s); else - break; + DeserializeStatement (manager, s); } } - return deserialized; } protected object DeserializeStatementToInstance (IDesignerSerializationManager manager, CodeStatement statement) { - object deserialized = null; - CodeAssignStatement assignment = statement as CodeAssignStatement; - if (assignment == null) - return null; - - // CodeFieldReferenceExpression - // - CodeFieldReferenceExpression fieldRef = assignment.Left as CodeFieldReferenceExpression; - if (fieldRef != null) - deserialized = base.DeserializeExpression (manager, fieldRef.FieldName, assignment.Right); - + if (assignment != null) { + // CodeFieldReferenceExpression + // + CodeFieldReferenceExpression fieldRef = assignment.Left as CodeFieldReferenceExpression; + if (fieldRef != null) + return base.DeserializeExpression (manager, fieldRef.FieldName, assignment.Right); + } base.DeserializeStatement (manager, statement); - - return deserialized; + return null; } } } diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializerBase.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializerBase.cs index e77df748f7e9e..347edecb54560 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializerBase.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/CodeDomSerializerBase.cs @@ -374,8 +374,10 @@ private CodeExpression[] SerializeParameters (IDesignerSerializationManager mana throw new ArgumentNullException ("manager"); PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (value, filter); - foreach (PropertyDescriptor property in properties) - this.SerializeProperty (manager, statements, value, property); + foreach (PropertyDescriptor property in properties) { + if (!property.Attributes.Contains (DesignerSerializationVisibilityAttribute.Hidden)) + this.SerializeProperty (manager, statements, value, property); + } } protected virtual object DeserializeInstance (IDesignerSerializationManager manager, Type type, @@ -729,9 +731,8 @@ protected object DeserializeExpression (IDesignerSerializationManager manager, s } if (errorOccurred) - return _errorMarker; - else - return deserialized; + deserialized = _errorMarker; + return deserialized; } // Searches for a method on type that matches argument types @@ -905,7 +906,7 @@ private void DeserializeAssignmentStatement (IDesignerSerializationManager manag internal void ReportError (IDesignerSerializationManager manager, string message) { - this.ReportError (manager, message, ""); + this.ReportError (manager, message, String.Empty); } internal void ReportError (IDesignerSerializationManager manager, string message, string details) diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs index 710d09849f575..f1c8127cb8647 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/DesignerSerializationManager.cs @@ -154,7 +154,6 @@ protected virtual void OnSessionCreated (EventArgs e) protected virtual object CreateInstance (Type type, ICollection arguments, string name, bool addToContainer) { VerifyInSession (); - object instance = null; if (name != null && _recycleInstances) { @@ -165,9 +164,8 @@ protected virtual object CreateInstance (Type type, ICollection arguments, strin } } - if (instance == null || !_recycleInstances) { + if (instance == null || !_recycleInstances) instance = this.CreateInstance (type, arguments); - } if (addToContainer && instance != null && this.Container != null && typeof (IComponent).IsAssignableFrom (type)) { if (_preserveNames) { @@ -274,7 +272,7 @@ public object GetSerializer (Type componentType, Type serializerType) // try 3: from provider // - if (serializer == null) { + if (serializer == null && _serializationProviders != null) { foreach (IDesignerSerializationProvider provider in _serializationProviders) { serializer = provider.GetSerializer (this, null, componentType, serializerType); if (serializer != null) @@ -299,6 +297,7 @@ private void VerifyNotInSession () public IDisposable CreateSession () { + VerifyNotInSession (); _errors = new ArrayList (); _session = new Session (this); _serializersCache = new Dictionary (); @@ -388,13 +387,13 @@ object IDesignerSerializationManager.GetInstance (string name) object instance = null; _instancesByNameCache.TryGetValue (name, out instance); - - if (instance == null && _preserveNames && this.Container != null) + + if (instance == null && this.Container != null) instance = this.Container.Components[name]; - + if (instance == null) instance = this.RequestInstance (name); - + return instance; } diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/PropertyCodeDomSerializer.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/PropertyCodeDomSerializer.cs index d1952c6c257b3..b75cc4d8e3be7 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/PropertyCodeDomSerializer.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/PropertyCodeDomSerializer.cs @@ -59,7 +59,7 @@ public override void Serialize (IDesignerSerializationManager manager, object va if (property.Attributes.Contains (DesignerSerializationVisibilityAttribute.Content)) SerializeContentProperty (manager, value, property, statements); - else if (!property.Attributes.Contains (DesignerSerializationVisibilityAttribute.Hidden)) + else SerializeNormalProperty (manager, value, property, statements); } @@ -152,11 +152,13 @@ public override bool ShouldSerialize (IDesignerSerializationManager manager, obj PropertyDescriptor property = (PropertyDescriptor) descriptor; - if (property.Attributes.Contains (DesignerSerializationVisibilityAttribute.Hidden)) - return false; - else if (property.Attributes.Contains (DesignOnlyAttribute.Yes)) + if (property.Attributes.Contains (DesignOnlyAttribute.Yes)) return false; + SerializeAbsoluteContext absolute = manager.Context[typeof (SerializeAbsoluteContext)] as SerializeAbsoluteContext; + if (absolute != null && absolute.ShouldSerialize (descriptor)) + return true; + bool result = property.ShouldSerializeValue (value); if (!result) { @@ -164,12 +166,6 @@ public override bool ShouldSerialize (IDesignerSerializationManager manager, obj result = true; } - if (!result) { - SerializeAbsoluteContext absolute = manager.Context[typeof (SerializeAbsoluteContext)] as SerializeAbsoluteContext; - if (absolute != null && absolute.ShouldSerialize (descriptor)) - result = true; - } - return result; } diff --git a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/SerializeAbsoluteContext.cs b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/SerializeAbsoluteContext.cs index 7f509dfea27ee..ebde9074c19ed 100644 --- a/mcs/class/System.Design/System.ComponentModel.Design.Serialization/SerializeAbsoluteContext.cs +++ b/mcs/class/System.Design/System.ComponentModel.Design.Serialization/SerializeAbsoluteContext.cs @@ -58,7 +58,7 @@ public SerializeAbsoluteContext (MemberDescriptor member) public bool ShouldSerialize (MemberDescriptor member) { - return !(member == _member); + return member == _member; } } }