diff --git a/source/Components/AvalonDock/Layout/LayoutAnchorableFloatingWindow.cs b/source/Components/AvalonDock/Layout/LayoutAnchorableFloatingWindow.cs index 7db59a02..6bfe812c 100644 --- a/source/Components/AvalonDock/Layout/LayoutAnchorableFloatingWindow.cs +++ b/source/Components/AvalonDock/Layout/LayoutAnchorableFloatingWindow.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -155,13 +155,13 @@ public override void ReadXml(XmlReader reader) XmlSerializer serializer; if (reader.LocalName.Equals(nameof(LayoutAnchorablePaneGroup))) - serializer = new XmlSerializer(typeof(LayoutAnchorablePaneGroup)); + serializer = XmlSerializer.FromTypes(new[] { typeof(LayoutAnchorablePaneGroup) })[0]; else { var type = LayoutRoot.FindType(reader.LocalName); if (type == null) throw new ArgumentException("AvalonDock.LayoutAnchorableFloatingWindow doesn't know how to deserialize " + reader.LocalName); - serializer = new XmlSerializer(type); + serializer = XmlSerializer.FromTypes(new[] { type })[0]; } RootPanel = (LayoutAnchorablePaneGroup)serializer.Deserialize(reader); } diff --git a/source/Components/AvalonDock/Layout/LayoutFloatingWindow.cs b/source/Components/AvalonDock/Layout/LayoutFloatingWindow.cs index 0a479b47..44ae1f14 100644 --- a/source/Components/AvalonDock/Layout/LayoutFloatingWindow.cs +++ b/source/Components/AvalonDock/Layout/LayoutFloatingWindow.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -61,7 +61,7 @@ public virtual void WriteXml(XmlWriter writer) foreach (var child in Children) { var type = child.GetType(); - var serializer = new XmlSerializer(type); + var serializer = XmlSerializer.FromTypes(new[] { type })[0]; serializer.Serialize(writer, child); } } diff --git a/source/Components/AvalonDock/Layout/LayoutGroup.cs b/source/Components/AvalonDock/Layout/LayoutGroup.cs index 98f70163..7b243e8b 100644 --- a/source/Components/AvalonDock/Layout/LayoutGroup.cs +++ b/source/Components/AvalonDock/Layout/LayoutGroup.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -150,31 +150,16 @@ public virtual void ReadXml(System.Xml.XmlReader reader) continue; } - XmlSerializer serializer = null; - if (reader.LocalName == nameof(LayoutAnchorablePaneGroup)) - serializer = new XmlSerializer(typeof(LayoutAnchorablePaneGroup)); - else if (reader.LocalName == nameof(LayoutAnchorablePane)) - serializer = new XmlSerializer(typeof(LayoutAnchorablePane)); - else if (reader.LocalName == nameof(LayoutAnchorable)) - serializer = new XmlSerializer(typeof(LayoutAnchorable)); - else if (reader.LocalName == nameof(LayoutDocumentPaneGroup)) - serializer = new XmlSerializer(typeof(LayoutDocumentPaneGroup)); - else if (reader.LocalName == nameof(LayoutDocumentPane)) - serializer = new XmlSerializer(typeof(LayoutDocumentPane)); - else if (reader.LocalName == nameof(LayoutDocument)) - serializer = new XmlSerializer(typeof(LayoutDocument)); - else if (reader.LocalName == nameof(LayoutAnchorGroup)) - serializer = new XmlSerializer(typeof(LayoutAnchorGroup)); - else if (reader.LocalName == nameof(LayoutPanel)) - serializer = new XmlSerializer(typeof(LayoutPanel)); - else - { - var type = FindType(reader.LocalName); - if (type == null) - throw new ArgumentException("AvalonDock.LayoutGroup doesn't know how to deserialize " + reader.LocalName); - serializer = new XmlSerializer(type); - } + string fullName = String.Format("{0}.{1}", GetType().Namespace, reader.LocalName); + Type typeForSerializer = Type.GetType(fullName); + + if (typeForSerializer == null) + typeForSerializer = FindType(reader.LocalName); + + if (typeForSerializer == null) + throw new ArgumentException("AvalonDock.LayoutGroup doesn't know how to deserialize " + reader.LocalName); + XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeForSerializer })[0]; Children.Add((T)serializer.Deserialize(reader)); } @@ -188,7 +173,7 @@ public virtual void WriteXml(System.Xml.XmlWriter writer) foreach (var child in Children) { var type = child.GetType(); - var serializer = new XmlSerializer(type); + var serializer = XmlSerializer.FromTypes(new[] { type })[0]; serializer.Serialize(writer, child); } } diff --git a/source/Components/AvalonDock/Layout/LayoutRoot.cs b/source/Components/AvalonDock/Layout/LayoutRoot.cs index 2cad3519..73fe1b4a 100644 --- a/source/Components/AvalonDock/Layout/LayoutRoot.cs +++ b/source/Components/AvalonDock/Layout/LayoutRoot.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -885,47 +885,47 @@ private object ReadElement(XmlReader reader) while (reader.NodeType == XmlNodeType.Whitespace) reader.Read(); if (reader.NodeType == XmlNodeType.EndElement) return null; - XmlSerializer serializer; + Type typeToSerialize; switch (reader.LocalName) { case nameof(LayoutAnchorablePaneGroup): - serializer = new XmlSerializer(typeof(LayoutAnchorablePaneGroup)); + typeToSerialize = typeof(LayoutAnchorablePaneGroup); break; case nameof(LayoutAnchorablePane): - serializer = new XmlSerializer(typeof(LayoutAnchorablePane)); + typeToSerialize = typeof(LayoutAnchorablePane); break; case nameof(LayoutAnchorable): - serializer = new XmlSerializer(typeof(LayoutAnchorable)); + typeToSerialize = typeof(LayoutAnchorable); break; case nameof(LayoutDocumentPaneGroup): - serializer = new XmlSerializer(typeof(LayoutDocumentPaneGroup)); + typeToSerialize = typeof(LayoutDocumentPaneGroup); break; case nameof(LayoutDocumentPane): - serializer = new XmlSerializer(typeof(LayoutDocumentPane)); + typeToSerialize = typeof(LayoutDocumentPane); break; case nameof(LayoutDocument): - serializer = new XmlSerializer(typeof(LayoutDocument)); + typeToSerialize = typeof(LayoutDocument); break; case nameof(LayoutAnchorGroup): - serializer = new XmlSerializer(typeof(LayoutAnchorGroup)); + typeToSerialize = typeof(LayoutAnchorGroup); break; case nameof(LayoutPanel): - serializer = new XmlSerializer(typeof(LayoutPanel)); + typeToSerialize = typeof(LayoutPanel); break; case nameof(LayoutDocumentFloatingWindow): - serializer = new XmlSerializer(typeof(LayoutDocumentFloatingWindow)); + typeToSerialize = typeof(LayoutDocumentFloatingWindow); break; case nameof(LayoutAnchorableFloatingWindow): - serializer = new XmlSerializer(typeof(LayoutAnchorableFloatingWindow)); + typeToSerialize = typeof(LayoutAnchorableFloatingWindow); break; case nameof(LeftSide): @@ -940,13 +940,12 @@ private object ReadElement(XmlReader reader) return reader.Read(); default: - var type = FindType(reader.LocalName); - if (type == null) + typeToSerialize = FindType(reader.LocalName); + if (typeToSerialize == null) throw new ArgumentException("AvalonDock.LayoutRoot doesn't know how to deserialize " + reader.LocalName); - serializer = new XmlSerializer(type); break; } - + XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeToSerialize })[0]; return serializer.Deserialize(reader); } diff --git a/source/Components/AvalonDock/Layout/Serialization/LayoutSerializer.cs b/source/Components/AvalonDock/Layout/Serialization/LayoutSerializer.cs index 7e7d0466..7244045f 100644 --- a/source/Components/AvalonDock/Layout/Serialization/LayoutSerializer.cs +++ b/source/Components/AvalonDock/Layout/Serialization/LayoutSerializer.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -76,6 +76,9 @@ protected virtual void FixupLayout(LayoutRoot layout) if (lcToFix.ContentId != null) previousAchorable = _previousAnchorables.FirstOrDefault(a => a.ContentId == lcToFix.ContentId); + if (previousAchorable != null && previousAchorable.Title != null) + lcToFix.Title = previousAchorable.Title; + if (LayoutSerializationCallback != null) { // Ask client application via callback if item should be deserialized diff --git a/source/Components/AvalonDock/Layout/Serialization/XmlLayoutSerializer.cs b/source/Components/AvalonDock/Layout/Serialization/XmlLayoutSerializer.cs index 438c472f..d883b82d 100644 --- a/source/Components/AvalonDock/Layout/Serialization/XmlLayoutSerializer.cs +++ b/source/Components/AvalonDock/Layout/Serialization/XmlLayoutSerializer.cs @@ -1,4 +1,4 @@ -/************************************************************************ +/************************************************************************ AvalonDock Copyright (C) 2007-2013 Xceed Software Inc. @@ -29,30 +29,53 @@ public XmlLayoutSerializer(DockingManager manager) #endregion Constructors + #region Private Methods + /// Desererialized LayoutRoot + /// Function for LayoutRoot deserialization. + + private delegate LayoutRoot DeserializeFunction(); + + /// Deserializes layout with the given function . + /// + private void DeserializeCommon(DeserializeFunction function) + { + try + { + StartDeserialization(); + var layout = function(); + FixupLayout(layout); + Manager.Layout = layout; + } + finally + { + EndDeserialization(); + } + } + #endregion + #region Public Methods + readonly XmlSerializer _serializer = XmlSerializer.FromTypes(new[] { typeof(LayoutRoot) })[0]; + /// Serialize the layout into a . /// public void Serialize(XmlWriter writer) { - var serializer = new XmlSerializer(typeof(LayoutRoot)); - serializer.Serialize(writer, Manager.Layout); + _serializer.Serialize(writer, Manager.Layout); } /// Serialize the layout into a . /// public void Serialize(TextWriter writer) { - var serializer = new XmlSerializer(typeof(LayoutRoot)); - serializer.Serialize(writer, Manager.Layout); + _serializer.Serialize(writer, Manager.Layout); } /// Serialize the layout into a . /// public void Serialize(Stream stream) { - var serializer = new XmlSerializer(typeof(LayoutRoot)); - serializer.Serialize(stream, Manager.Layout); + _serializer.Serialize(stream, Manager.Layout); } /// Serialize the layout into a file using a . @@ -67,54 +90,26 @@ public void Serialize(string filepath) /// public void Deserialize(System.IO.Stream stream) { - try - { - StartDeserialization(); - var serializer = new XmlSerializer(typeof(LayoutRoot)); - var layout = serializer.Deserialize(stream) as LayoutRoot; - FixupLayout(layout); - Manager.Layout = layout; - } - finally - { - EndDeserialization(); - } + LayoutRoot function() => _serializer.Deserialize(stream) as LayoutRoot; + DeserializeCommon(function); } /// Deserialize the layout a file from a . /// public void Deserialize(TextReader reader) { - try - { - StartDeserialization(); - var serializer = new XmlSerializer(typeof(LayoutRoot)); - var layout = serializer.Deserialize(reader) as LayoutRoot; - FixupLayout(layout); - Manager.Layout = layout; - } - finally - { - EndDeserialization(); - } + + LayoutRoot function() => _serializer.Deserialize(reader) as LayoutRoot; + DeserializeCommon(function); } /// Deserialize the layout a file from a . /// public void Deserialize(XmlReader reader) { - try - { - StartDeserialization(); - var serializer = new XmlSerializer(typeof(LayoutRoot)); - var layout = serializer.Deserialize(reader) as LayoutRoot; - FixupLayout(layout); - Manager.Layout = layout; - } - finally - { - EndDeserialization(); - } + + LayoutRoot function() => _serializer.Deserialize(reader) as LayoutRoot; + DeserializeCommon(function); } /// Deserialize the layout from a file using a .