191 lines
5.5 KiB
C#
191 lines
5.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Reflection;
|
||
using System.Runtime.Serialization;
|
||
using System.Runtime.Serialization.Formatters.Binary;
|
||
using System.Xml;
|
||
using System.Xml.Serialization;
|
||
using Aitex.Core.RT.Log;
|
||
|
||
namespace Aitex.Core.Util
|
||
{
|
||
public sealed class ObjectSerializer
|
||
{
|
||
private ObjectSerializer()
|
||
{
|
||
}
|
||
|
||
public static MemoryStream SerializeObjectToMemoryStream(object valueToSerializeToMemoryStream)
|
||
{
|
||
MemoryStream memoryStream = new MemoryStream();
|
||
Type type = valueToSerializeToMemoryStream.GetType();
|
||
XmlSerializer xmlSerializer = new XmlSerializer(type);
|
||
xmlSerializer.Serialize(memoryStream, valueToSerializeToMemoryStream);
|
||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||
return memoryStream;
|
||
}
|
||
|
||
public static XmlDocument SerializeObjectToXmlDom(object obj)
|
||
{
|
||
Stream inStream = SerializeObjectToMemoryStream(obj);
|
||
XmlDocument xmlDocument = new XmlDocument();
|
||
xmlDocument.Load(inStream);
|
||
return xmlDocument;
|
||
}
|
||
|
||
private static Type[] RemoveDuplicateType(Type typeOfObject, IEnumerable<Type> types)
|
||
{
|
||
List<Type> list = new List<Type>();
|
||
foreach (Type type in types)
|
||
{
|
||
if (!type.FullName.Equals(typeOfObject.FullName))
|
||
{
|
||
list.Add(type);
|
||
}
|
||
}
|
||
return list.ToArray();
|
||
}
|
||
|
||
public static MemoryStream SerializeObjectToMemoryStream(object valueToSerializeToMemoryStream, Type[] types)
|
||
{
|
||
MemoryStream memoryStream = new MemoryStream();
|
||
Type type = valueToSerializeToMemoryStream.GetType();
|
||
types = RemoveDuplicateType(type, types);
|
||
XmlSerializer xmlSerializer = new XmlSerializer(type, types);
|
||
xmlSerializer.Serialize(memoryStream, valueToSerializeToMemoryStream);
|
||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||
return memoryStream;
|
||
}
|
||
|
||
public static MemoryStream SerializeObjectToBinaryStream(object valueToSerializeToMemoryStream)
|
||
{
|
||
MemoryStream memoryStream = new MemoryStream();
|
||
IFormatter formatter = new BinaryFormatter();
|
||
formatter.Serialize(memoryStream, valueToSerializeToMemoryStream);
|
||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||
return memoryStream;
|
||
}
|
||
|
||
public static bool SerializeObjectToBinaryFile(string fullFileName, object valueToSerialize)
|
||
{
|
||
try
|
||
{
|
||
using FileStream fileStream = new FileStream(fullFileName, FileMode.OpenOrCreate);
|
||
IFormatter formatter = new BinaryFormatter();
|
||
formatter.Serialize(fileStream, valueToSerialize);
|
||
fileStream.Seek(0L, SeekOrigin.Begin);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Error(ex.Message);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
public static string SerializeObjectToXml(object valueToSerializeToMemoryStream)
|
||
{
|
||
using MemoryStream stream = SerializeObjectToMemoryStream(valueToSerializeToMemoryStream);
|
||
using StreamReader streamReader = new StreamReader(stream);
|
||
return streamReader.ReadToEnd();
|
||
}
|
||
|
||
public static bool SerializeObjectToXmlFile(string fullFileName, object valueToSerializeToFile)
|
||
{
|
||
try
|
||
{
|
||
using FileStream fileStream = new FileStream(fullFileName, FileMode.Create);
|
||
using (MemoryStream memoryStream = SerializeObjectToMemoryStream(valueToSerializeToFile))
|
||
{
|
||
memoryStream.WriteTo(fileStream);
|
||
memoryStream.Close();
|
||
}
|
||
fileStream.Close();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Error(ex.Message);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
public static T DeserializeObjectFromStream<T>(Stream stream)
|
||
{
|
||
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
|
||
return (T)xmlSerializer.Deserialize(stream);
|
||
}
|
||
|
||
public static T DeserializeObjectFromBinaryFile<T>(string binFilePath)
|
||
{
|
||
T val = default(T);
|
||
using FileStream stream = new FileStream(binFilePath, FileMode.OpenOrCreate);
|
||
return (T)DeserializeObjectFromBinaryStream(stream);
|
||
}
|
||
|
||
public static object DeserializeObjectFromBinaryStream(Stream stream)
|
||
{
|
||
IFormatter formatter = new BinaryFormatter();
|
||
return formatter.Deserialize(stream);
|
||
}
|
||
|
||
public static object DeserializeObjectFromStream(Stream stream, Type typeOfObject)
|
||
{
|
||
try
|
||
{
|
||
XmlSerializer xmlSerializer = new XmlSerializer(typeOfObject);
|
||
return xmlSerializer.Deserialize(stream);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
LOG.Error($"界面发序列化数据出错:\n函数名:{MethodBase.GetCurrentMethod().Name}\n串行数据内容:{stream.ToString()}", ex);
|
||
throw;
|
||
}
|
||
}
|
||
|
||
public static object DeserializeObjectFromStream(Stream stream, Type typeOfObject, Type[] types)
|
||
{
|
||
types = RemoveDuplicateType(typeOfObject, types);
|
||
XmlSerializer xmlSerializer = new XmlSerializer(typeOfObject, types);
|
||
return xmlSerializer.Deserialize(stream);
|
||
}
|
||
|
||
public static object DeserializeObjectFromXml(string xml, Type typeToDeserialize)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(xml))
|
||
{
|
||
return null;
|
||
}
|
||
using MemoryStream memoryStream = new MemoryStream();
|
||
XmlDocument xmlDocument = new XmlDocument();
|
||
xmlDocument.LoadXml(xml);
|
||
xmlDocument.Save(memoryStream);
|
||
memoryStream.Seek(0L, SeekOrigin.Begin);
|
||
return DeserializeObjectFromStream(memoryStream, typeToDeserialize);
|
||
}
|
||
|
||
public static T DeserializeObjectFromXmlFile<T>(string xmlFilePath)
|
||
{
|
||
T result = default(T);
|
||
FileInfo fileInfo = new FileInfo(xmlFilePath);
|
||
if (!fileInfo.Exists)
|
||
{
|
||
return result;
|
||
}
|
||
using (StreamReader streamReader = new StreamReader(xmlFilePath))
|
||
{
|
||
if (string.IsNullOrWhiteSpace(streamReader.ReadToEnd()))
|
||
{
|
||
return result;
|
||
}
|
||
}
|
||
using (FileStream stream = new FileStream(xmlFilePath, FileMode.Open))
|
||
{
|
||
result = DeserializeObjectFromStream<T>(stream);
|
||
}
|
||
return result;
|
||
}
|
||
}
|
||
}
|