这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -155,13 +155,13 @@ public override void ReadXml(XmlReader reader)

XmlSerializer serializer;
if (reader.LocalName.Equals(nameof(LayoutAnchorablePaneGroup)))
serializer = XmlSerializer.FromTypes(new[] { typeof(LayoutAnchorablePaneGroup) })[0];
serializer = XmlSerializersCache.GetSerializer<LayoutAnchorablePaneGroup>();
else
{
var type = LayoutRoot.FindType(reader.LocalName);
if (type == null)
throw new ArgumentException("AvalonDock.LayoutAnchorableFloatingWindow doesn't know how to deserialize " + reader.LocalName);
serializer = XmlSerializer.FromTypes(new[] { type })[0];
serializer = XmlSerializersCache.GetSerializer(type);
}
RootPanel = (LayoutAnchorablePaneGroup)serializer.Deserialize(reader);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -153,12 +153,12 @@ public override void ReadXml(XmlReader reader)

XmlSerializer serializer;
if (reader.LocalName.Equals(nameof(LayoutDocument)))
serializer = new XmlSerializer(typeof(LayoutDocument));
serializer = XmlSerializersCache.GetSerializer<LayoutDocument>();
else
{
var type = LayoutRoot.FindType(reader.LocalName);
if (type == null) throw new ArgumentException("AvalonDock.LayoutDocumentFloatingWindow doesn't know how to deserialize " + reader.LocalName);
serializer = new XmlSerializer(type);
serializer = XmlSerializersCache.GetSerializer(type);
}
RootPanel = (LayoutDocumentPaneGroup)serializer.Deserialize(reader);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public virtual void WriteXml(XmlWriter writer)
foreach (var child in Children)
{
var type = child.GetType();
var serializer = XmlSerializer.FromTypes(new[] { type })[0];
var serializer = XmlSerializersCache.GetSerializer(type);
serializer.Serialize(writer, child);
}
}
Expand Down
4 changes: 2 additions & 2 deletions source/Components/AvalonDock/Layout/LayoutGroup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public virtual void ReadXml(System.Xml.XmlReader reader)
if (typeForSerializer == null)
throw new ArgumentException("AvalonDock.LayoutGroup doesn't know how to deserialize " + reader.LocalName);

XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeForSerializer })[0];
XmlSerializer serializer = XmlSerializersCache.GetSerializer(typeForSerializer);
Children.Add((T)serializer.Deserialize(reader));
}

Expand All @@ -173,7 +173,7 @@ public virtual void WriteXml(System.Xml.XmlWriter writer)
foreach (var child in Children)
{
var type = child.GetType();
var serializer = XmlSerializer.FromTypes(new[] { type })[0];
var serializer = XmlSerializersCache.GetSerializer(type);
serializer.Serialize(writer, child);
}
}
Expand Down
2 changes: 1 addition & 1 deletion source/Components/AvalonDock/Layout/LayoutRoot.cs
Original file line number Diff line number Diff line change
Expand Up @@ -966,7 +966,7 @@ private object ReadElement(XmlReader reader)
throw new ArgumentException("AvalonDock.LayoutRoot doesn't know how to deserialize " + reader.LocalName);
break;
}
XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeToSerialize })[0];
XmlSerializer serializer = XmlSerializersCache.GetSerializer(typeToSerialize);
return serializer.Deserialize(reader);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ private void DeserializeCommon(DeserializeFunction function)

#region Public Methods

readonly XmlSerializer _serializer = XmlSerializer.FromTypes(new[] { typeof(LayoutRoot) })[0];
readonly XmlSerializer _serializer = XmlSerializersCache.GetSerializer<LayoutRoot>();

/// <summary>Serialize the layout into a <see cref="XmlWriter"/>.</summary>
/// <param name="writer"></param>
Expand Down
34 changes: 34 additions & 0 deletions source/Components/AvalonDock/XmlSerializersCache.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System;
using System.Collections.Concurrent;
using System.Xml.Serialization;

namespace AvalonDock
{
internal static class XmlSerializersCache
{
private static readonly object s_lock = new object();
private static readonly ConcurrentDictionary<Type, XmlSerializer> s_cache = new ConcurrentDictionary<Type, XmlSerializer>();


public static XmlSerializer GetSerializer(Type targetType)
{
if (s_cache.TryGetValue(targetType, out var serializer))
return serializer;

lock (s_lock)
{
// we can have multiple threads waiting on lock
// one of them could create what we were looking for
if (!s_cache.TryGetValue(targetType, out serializer))
{
serializer = XmlSerializer.FromTypes(new[] { targetType })[0];
_ = s_cache.TryAdd(targetType, serializer);
}
}

return serializer;
}

public static XmlSerializer GetSerializer<T>() => GetSerializer(typeof(T));
}
}