109 lines
3.8 KiB
C#
109 lines
3.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Xml.Serialization;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Runtime.Serialization;
|
|
using System.Xml;
|
|
using System.Reflection;
|
|
using Ubisoft.StringMatcher;
|
|
|
|
namespace PluginCommon
|
|
{
|
|
public class DefaultResolver: DataContractResolver
|
|
{
|
|
private readonly XmlDictionary m_dictionary = null;
|
|
|
|
public DefaultResolver()
|
|
{
|
|
m_dictionary = new XmlDictionary();
|
|
}
|
|
|
|
public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out System.Xml.XmlDictionaryString typeName, out System.Xml.XmlDictionaryString typeNamespace)
|
|
{
|
|
if(type.Assembly == Assembly.GetExecutingAssembly())
|
|
{
|
|
if(!m_dictionary.TryLookup(type.Name, out typeName))
|
|
typeName = m_dictionary.Add(type.Name);
|
|
if(!m_dictionary.TryLookup(type.Namespace, out typeNamespace))
|
|
typeNamespace = m_dictionary.Add(type.Namespace);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return knownTypeResolver.TryResolveType(type, declaredType, null, out typeName, out typeNamespace);
|
|
}
|
|
}
|
|
|
|
public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver)
|
|
{
|
|
int offset = typeNamespace.LastIndexOf('/');
|
|
string @namespace = offset == -1 ? typeNamespace : typeNamespace.Substring(offset + 1);
|
|
string fullname = @namespace + '.' + typeName;
|
|
Type foundType = Assembly.GetEntryAssembly().GetType(fullname);
|
|
if(foundType != null)
|
|
return foundType;
|
|
else
|
|
{
|
|
foundType = Assembly.GetExecutingAssembly().GetType(fullname);
|
|
if(foundType != null)
|
|
return foundType;
|
|
else
|
|
return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class XmlSave
|
|
{
|
|
public static void Save<T>(string _outputFile, T _object)
|
|
{
|
|
string tmpFileName = Path.GetTempFileName();
|
|
var serializer = new DataContractSerializer(_object.GetType(), null, Int32.MaxValue, false, false, null, new DefaultResolver());
|
|
|
|
using(StreamWriter stream = File.CreateText(tmpFileName))
|
|
using(XmlTextWriter writer = new XmlTextWriter(stream))
|
|
{
|
|
writer.Formatting = Formatting.Indented;
|
|
serializer.WriteObject(writer, _object);
|
|
}
|
|
|
|
string outputDir = Path.GetDirectoryName(_outputFile);
|
|
if(!Directory.Exists(outputDir))
|
|
Directory.CreateDirectory(outputDir);
|
|
|
|
if(File.Exists(_outputFile))
|
|
{
|
|
File.SetAttributes(_outputFile, FileAttributes.Normal);
|
|
File.Delete(_outputFile);
|
|
}
|
|
|
|
File.Move(tmpFileName, _outputFile);
|
|
}
|
|
|
|
public static T Load<T>(string _file)
|
|
{
|
|
var serializer = new DataContractSerializer(typeof(T), null, Int32.MaxValue, false, false, null, new DefaultResolver());
|
|
|
|
using(StreamReader stream = File.OpenText(_file))
|
|
using(XmlTextReader reader = new XmlTextReader(stream))
|
|
{
|
|
return (T)serializer.ReadObject(reader);
|
|
}
|
|
}
|
|
|
|
public string GetXml()
|
|
{
|
|
XmlSerializer xmlSerial = new XmlSerializer(this.GetType());
|
|
|
|
MemoryStream ms = new MemoryStream();
|
|
xmlSerial.Serialize(ms, this);
|
|
|
|
ms.Flush();
|
|
|
|
string str = System.Text.Encoding.Default.GetString(ms.GetBuffer());
|
|
return str;
|
|
}
|
|
}
|
|
}
|