C#之XML文件操作
·
C#之XML文件操作
一 XMLHelper
using System;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Helper
{
public class XMLHelper
{
public static XmlNode Create(string nodeName)
{
var doc = new XmlDocument();
XmlNode node = doc.CreateElement(nodeName);
return node;
}
public static XmlAttribute CreateAttribute(XmlNode node, string attributeName, string value)
{
try
{
XmlDocument doc = node.OwnerDocument;
XmlAttribute attr = doc.CreateAttribute(attributeName);
attr.Value = value;
node.Attributes.SetNamedItem(attr);
return attr;
}
catch (Exception err)
{
string desc = err.Message;
return null;
}
}
public static XmlNode ObjectToXML(object config)
{
var xnd = new XmlDocument();
if (config != null)
{
//we need the type to serialize
Type t = config.GetType();
var ser = new XmlSerializer(t);
//will hold the xml
using (var writer = new StringWriter(CultureInfo.InvariantCulture))
{
ser.Serialize(writer, config);
xnd.LoadXml(writer.ToString());
writer.Close();
}
}
return xnd.DocumentElement;
}
public static object XMLToObject(XmlNode node, Type objectType)
{
object convertedObject = null;
if (node != null)
{
using (var reader = new StringReader(node.OuterXml))
{
var ser = new XmlSerializer(objectType);
convertedObject = ser.Deserialize(reader);
reader.Close();
}
}
return convertedObject;
}
}
public class XmlSerializerHelper
{
/// <summary>
/// 读取XML文件
/// </summary>
/// <param name="XmlFilePath"></param>
/// <param name="type"></param>
/// <returns></returns>
public static object ReadXML(string XmlFilePath, Type type)
{
if (!File.Exists(XmlFilePath))
{
throw new Exception($"File {XmlFilePath} not Exists");
}
using (var fs = new FileStream(XmlFilePath, FileMode.Open))
{
return new XmlSerializer(type).Deserialize(fs);
}
}
/// <summary>
/// 序列化XML文件
/// </summary>
/// <param name="data"></param>
/// <param name="file"></param>
/// <param name="type"></param>
/// <returns></returns>
public static bool WriteXML(object data, string file, Type type)
{
using (var fs = new FileStream(file, FileMode.Create))
{
new XmlSerializer(type).Serialize(fs, data);
}
return true;
}
public static string XMLSerialize<T>(T entity)
{
var buffer = new StringBuilder();
var serializer = new XmlSerializer(typeof(T));
using (TextWriter writer = new StringWriter(buffer))
{
serializer.Serialize(writer, entity);
}
return buffer.ToString();
}
public static string ByteToString(byte[] data)
{
return Encoding.Default.GetString(data);
}
public static byte[] StringToByte(string value)
{
return Encoding.Default.GetBytes(value);
}
public static T DeXMLSerialize<T>(string xmlString)
{
T cloneObject = default(T);
var buffer = new StringBuilder();
buffer.Append(xmlString);
var serializer = new XmlSerializer(typeof(T));
using (TextReader reader = new StringReader(buffer.ToString()))
{
Object obj = serializer.Deserialize(reader);
cloneObject = (T)obj;
}
return cloneObject;
}
/// <summary>
/// 把对象序列化为字符串
/// </summary>
/// <param name="pObj"></param>
/// <returns></returns>
public static byte[] SerializeObject(object pObj)
{
if (pObj == null)
return null;
var _memory = new MemoryStream();
var formatter = new BinaryFormatter();
formatter.Serialize(_memory, pObj);
_memory.Position = 0;
var read = new byte[_memory.Length];
_memory.Read(read, 0, read.Length);
_memory.Close();
return Compress(read);
}
/// <summary>
/// 把字节反序列化成相应的对象
/// </summary>
/// <param name="pBytes">字节流</param>
/// <returns>object</returns>
public static object DeserializeObject(byte[] pBytes)
{
object _newOjb = null;
if (pBytes == null)
return _newOjb;
var _memory = new MemoryStream(Decompress(pBytes));
_memory.Position = 0;
var formatter = new BinaryFormatter();
_newOjb = formatter.Deserialize(_memory);
_memory.Close();
return _newOjb;
}
/// <summary>
/// Write byte[] to file
/// </summary>
public static void WriteByteToFile(byte[] dataSource, string filePath)
{
var fs = new FileStream(filePath, FileMode.Create);
//将byte数组写入文件中
fs.Write(dataSource, 0, dataSource.Length);
fs.Close();
}
/// <summary>
/// Read byte from file
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static byte[] ReadByteFromFile(string filePath)
{
var fs = new FileStream(filePath, FileMode.Open);
//获取文件大小
long size = fs.Length;
var array = new byte[size];
//将文件读到byte数组中
fs.Read(array, 0, array.Length);
fs.Close();
return array;
}
/// <summary>
/// Write object to file
/// </summary>
public static void WriteObjectToFile(object dataSource, string filePath)
{
var fs = new FileStream(filePath, FileMode.Create);
byte[] arraysource = SerializeObject(dataSource);
//将byte数组写入文件中
fs.Write(arraysource, 0, arraysource.Length);
fs.Close();
}
/// <summary>
/// Read object from file
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static object ReadObjectFromFile(string filePath)
{
var fs = new FileStream(filePath, FileMode.Open);
//获取文件大小
long size = fs.Length;
var array = new byte[size];
//将文件读到byte数组中
fs.Read(array, 0, array.Length);
fs.Close();
return DeserializeObject(array);
}
/// <summary>
/// 字符串压缩
/// </summary>
/// <param name="strSource"></param>
/// <returns></returns>
public static byte[] Compress(byte[] data)
{
try
{
var ms = new MemoryStream();
var zip = new GZipStream(ms, CompressionMode.Compress, true);
zip.Write(data, 0, data.Length);
zip.Close();
var buffer = new byte[ms.Length];
ms.Position = 0;
ms.Read(buffer, 0, buffer.Length);
ms.Close();
return buffer;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// 字符串解压缩
/// </summary>
/// <param name="strSource"></param>
/// <returns></returns>
public static byte[] Decompress(byte[] data)
{
try
{
var ms = new MemoryStream(data);
var zip = new GZipStream(ms, CompressionMode.Decompress, true);
var msreader = new MemoryStream();
var buffer = new byte[0x1000];
while (true)
{
int reader = zip.Read(buffer, 0, buffer.Length);
if (reader <= 0)
{
break;
}
msreader.Write(buffer, 0, reader);
}
zip.Close();
ms.Close();
msreader.Position = 0;
buffer = msreader.ToArray();
msreader.Close();
return buffer;
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}
/// <summary>
/// string 压缩
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string CompressString(string str)
{
string compressString = "";
byte[] compressBeforeByte = Encoding.GetEncoding("UTF-8").GetBytes(str);
byte[] compressAfterByte = Compress(compressBeforeByte);
//compressString = Encoding.GetEncoding("UTF-8").GetString(compressAfterByte);
compressString = Convert.ToBase64String(compressAfterByte);
return compressString;
}
/// <summary>
/// string 解压缩
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string DecompressString(string str)
{
string compressString = "";
//byte[] compressBeforeByte = Encoding.GetEncoding("UTF-8").GetBytes(str);
byte[] compressBeforeByte = Convert.FromBase64String(str);
byte[] compressAfterByte = Decompress(compressBeforeByte);
compressString = Encoding.GetEncoding("UTF-8").GetString(compressAfterByte);
return compressString;
}
}
}
二 DataModel
public class DataModel
{
[Category("算法参数"), Description("面积阈值")]
public double Area { get; set; } = 100;
[Category("算法参数"), Description("宽阈值")]
public double Width{ get; set; } = 200;
[Category("算法参数"), Description("高阈值")]
public double Height{ get; set; } = 300;
}
三 保存XML文件
private void button1_Click(object sender, EventArgs e)
{
DataModel dataModel = new DataModel();
dataModel.Area = 101;
dataModel.Width= 202;
dataModel.Height= 303;
XmlSerializerHelper.WriteXML(dataModel,@"D:\\DataModel.xml", typeof(DataModel));
}
四 读取XML文件
private void button2_Click(object sender, EventArgs e)
{
DataModel dataModel = new DataModel();
dataModel = XmlSerializerHelper.ReadXML("testXmlDataModel.xml", typeof(TestXmlDataModel)) as TestXmlDataModel;
Double test1 = Convert.ToDouble(dataModel.Area);
Double test2 = Convert.ToDouble(dataModel.Width);
Double test3 = Convert.ToDouble(dataModel.Height);
propertyGrid1.SelectedObject=dataModel;
}
五 propertyGrid1
DataModel dataModel = new DataModel();
dataModel = XmlSerializerHelper.ReadXML("testXmlDataModel.xml", typeof(TestXmlDataModel)) as TestXmlDataModel;
Double test1 = Convert.ToDouble(dataModel.Area);
Double test2 = Convert.ToDouble(dataModel.Width);
Double test3 = Convert.ToDouble(dataModel.Height);
propertyGrid1.SelectedObject=dataModel;

更多推荐



所有评论(0)