CPF/CPF.ReoGrid/Utility/XMLHelper.cs
2024-06-24 10:15:59 +08:00

94 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using CPF.ReoGrid.Common;
namespace CPF.ReoGrid.Utility
{
internal static class XMLHelper
{
public static T LoadXML<T>(Stream s) where T : class
{
Type typeFromHandle = typeof(T);
Stopwatch stopwatch = Stopwatch.StartNew();
T result;
try
{
XmlSerializer xmlSerializer = null;
bool flag = XMLHelper.xmlSerializers == null;
if (flag)
{
XMLHelper.xmlSerializers = new Dictionary<Type, XmlSerializer>();
}
bool flag2 = !XMLHelper.xmlSerializers.TryGetValue(typeFromHandle, out xmlSerializer);
if (flag2)
{
xmlSerializer = (XMLHelper.xmlSerializers[typeFromHandle] = new XmlSerializer(typeFromHandle));
}
result = (xmlSerializer.Deserialize(s) as T);
}
finally
{
stopwatch.Stop();
Logger.Log("xml utility", "type loaded: {0}, {1} ms.", new object[]
{
typeFromHandle.Name,
stopwatch.ElapsedMilliseconds
});
}
return result;
}
public static void SaveXML<T>(Stream s, T obj)
{
Type typeFromHandle = typeof(T);
Stopwatch stopwatch = Stopwatch.StartNew();
try
{
XmlSerializer xmlSerializer = null;
bool flag = XMLHelper.xmlSerializers == null;
if (flag)
{
XMLHelper.xmlSerializers = new Dictionary<Type, XmlSerializer>();
}
bool flag2 = !XMLHelper.xmlSerializers.TryGetValue(typeFromHandle, out xmlSerializer);
if (flag2)
{
xmlSerializer = (XMLHelper.xmlSerializers[typeFromHandle] = new XmlSerializer(typeFromHandle));
}
XmlSerializerNamespaces namespaces = null;
FieldInfo field = obj.GetType().GetField("xmlns", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
bool flag3 = field != null;
if (flag3)
{
namespaces = (field.GetValue(obj) as XmlSerializerNamespaces);
}
XmlWriterSettings settings = new XmlWriterSettings
{
Encoding = Encoding.UTF8
};
using (XmlWriter xmlWriter = XmlWriter.Create(s, settings))
{
xmlSerializer.Serialize(xmlWriter, obj, namespaces);
}
}
finally
{
stopwatch.Stop();
Logger.Log("xml utility", "type saved: {0}, {1} ms.", new object[]
{
typeFromHandle.Name,
stopwatch.ElapsedMilliseconds
});
}
}
private static Dictionary<Type, XmlSerializer> xmlSerializers;
}
}