JD2022-TU1/main/tools/legacy/PluginCommon/XmlSave.cs

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;
}
}
}