using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Script.Serialization; using System.Xml.Serialization; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap;namespace Common { public class SerializableClass { #region Json序列化
public static void ObjectToJson(object obj, string FilePath) { JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); string SerializableStr= _JavaScriptSerializer.Serialize(obj); File.WriteAllText(FilePath, SerializableStr); } public static object JsonToObject(string FilePath) { StreamReader streamReader = new StreamReader(FilePath); JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd()); } #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType()); StreamWriter _StreamWriter = new StreamWriter(FilePath); _XmlSerializer.Serialize(_StreamWriter, obj); } public static object XmlToObject(Type _Type, string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(_Type); FileStream _FileStream = new FileStream(FilePath, FileMode.Open); return _XmlSerializer.Deserialize(_FileStream); } #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath) { IFormatter formatter = new BinaryFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); formatter.Serialize(_FileStream, obj); } } public object BinToObject(string FilePath) { IFormatter formatter = new BinaryFormatter(); if (File.Exists(FilePath)) { using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); return (object)formatter.Deserialize(_FileStream); } } else { return null; } } #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { formatter.Serialize(_FileStream, obj); } } public static object SoapToObject(string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { return (object)formatter.Deserialize(_FileStream); } } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Script.Serialization; using System.Xml.Serialization; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap;namespace Common { public class SerializableClass { #region Json序列化
public static void ObjectToJson(object obj, string FilePath) { JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); string SerializableStr= _JavaScriptSerializer.Serialize(obj); File.WriteAllText(FilePath, SerializableStr); } public static object JsonToObject(string FilePath) { StreamReader streamReader = new StreamReader(FilePath); JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd()); } #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType()); StreamWriter _StreamWriter = new StreamWriter(FilePath); _XmlSerializer.Serialize(_StreamWriter, obj); } public static object XmlToObject(Type _Type, string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(_Type); FileStream _FileStream = new FileStream(FilePath, FileMode.Open); return _XmlSerializer.Deserialize(_FileStream); } #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath) { IFormatter formatter = new BinaryFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); formatter.Serialize(_FileStream, obj); } } public object BinToObject(string FilePath) { IFormatter formatter = new BinaryFormatter(); if (File.Exists(FilePath)) { using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); return (object)formatter.Deserialize(_FileStream); } } else { return null; } } #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { formatter.Serialize(_FileStream, obj); } } public static object SoapToObject(string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { return (object)formatter.Deserialize(_FileStream); } } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using System.Web.Script.Serialization; using System.Xml.Serialization; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization.Formatters.Soap;namespace Common { public class SerializableClass { #region Json序列化
public static void ObjectToJson(object obj, string FilePath) { JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); string SerializableStr= _JavaScriptSerializer.Serialize(obj); File.WriteAllText(FilePath, SerializableStr); } public static object JsonToObject(string FilePath) { StreamReader streamReader = new StreamReader(FilePath); JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer(); return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd()); } #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType()); StreamWriter _StreamWriter = new StreamWriter(FilePath); _XmlSerializer.Serialize(_StreamWriter, obj); } public static object XmlToObject(Type _Type, string FilePath) { XmlSerializer _XmlSerializer = new XmlSerializer(_Type); FileStream _FileStream = new FileStream(FilePath, FileMode.Open); return _XmlSerializer.Deserialize(_FileStream); } #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath) { IFormatter formatter = new BinaryFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); formatter.Serialize(_FileStream, obj); } } public object BinToObject(string FilePath) { IFormatter formatter = new BinaryFormatter(); if (File.Exists(FilePath)) { using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { _FileStream.Position = 0; _FileStream.Seek(0, SeekOrigin.Begin); return (object)formatter.Deserialize(_FileStream); } } else { return null; } } #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None )) { formatter.Serialize(_FileStream, obj); } } public static object SoapToObject(string FilePath) { IFormatter formatter = new SoapFormatter(); using (FileStream _FileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None )) { return (object)formatter.Deserialize(_FileStream); } } #endregion } }
1、数据重建上的问题:由于是上下文相关的,例如句柄等信息,重建后的句柄数据是没有意义的。
2、传输上的问题:比如你序列化了一个Form,然后传到另一台机器上试图反序列化,由于两台机器环境可能不同(比如句柄已被分配),此时反序列化后的对象会有很多数据是“无效”的
因此,在做remoting的时候你会发现,事实上窗体根本没法通过网络传输。传统的做法就是把Form中你所关心的那些属性抽出来,另外定义一个类,在序列化的时候逐个赋值到这个类中的属性,然后序列化这个类。
或者还有一种高级的做法,就是使用CodeDom。就如2楼给出的那个链接里所述。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;namespace Common
{
public class SerializableClass
{ #region Json序列化
public static void ObjectToJson(object obj, string FilePath)
{
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
string SerializableStr= _JavaScriptSerializer.Serialize(obj);
File.WriteAllText(FilePath, SerializableStr);
} public static object JsonToObject(string FilePath)
{
StreamReader streamReader = new StreamReader(FilePath);
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
} #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
StreamWriter _StreamWriter = new StreamWriter(FilePath);
_XmlSerializer.Serialize(_StreamWriter, obj);
} public static object XmlToObject(Type _Type, string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
return _XmlSerializer.Deserialize(_FileStream);
} #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath)
{
IFormatter formatter = new BinaryFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
formatter.Serialize(_FileStream, obj);
}
} public object BinToObject(string FilePath)
{
IFormatter formatter = new BinaryFormatter();
if (File.Exists(FilePath))
{
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
return (object)formatter.Deserialize(_FileStream);
}
}
else
{
return null;
}
} #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
formatter.Serialize(_FileStream, obj);
} } public static object SoapToObject(string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
return (object)formatter.Deserialize(_FileStream);
}
} #endregion }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;namespace Common
{
public class SerializableClass
{ #region Json序列化
public static void ObjectToJson(object obj, string FilePath)
{
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
string SerializableStr= _JavaScriptSerializer.Serialize(obj);
File.WriteAllText(FilePath, SerializableStr);
} public static object JsonToObject(string FilePath)
{
StreamReader streamReader = new StreamReader(FilePath);
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
} #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
StreamWriter _StreamWriter = new StreamWriter(FilePath);
_XmlSerializer.Serialize(_StreamWriter, obj);
} public static object XmlToObject(Type _Type, string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
return _XmlSerializer.Deserialize(_FileStream);
} #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath)
{
IFormatter formatter = new BinaryFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
formatter.Serialize(_FileStream, obj);
}
} public object BinToObject(string FilePath)
{
IFormatter formatter = new BinaryFormatter();
if (File.Exists(FilePath))
{
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
return (object)formatter.Deserialize(_FileStream);
}
}
else
{
return null;
}
} #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
formatter.Serialize(_FileStream, obj);
} } public static object SoapToObject(string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
return (object)formatter.Deserialize(_FileStream);
}
} #endregion }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;namespace Common
{
public class SerializableClass
{ #region Json序列化
public static void ObjectToJson(object obj, string FilePath)
{
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
string SerializableStr= _JavaScriptSerializer.Serialize(obj);
File.WriteAllText(FilePath, SerializableStr);
} public static object JsonToObject(string FilePath)
{
StreamReader streamReader = new StreamReader(FilePath);
JavaScriptSerializer _JavaScriptSerializer = new JavaScriptSerializer();
return _JavaScriptSerializer.DeserializeObject(streamReader.ReadToEnd());
} #endregion #region Xml序列化 public static void ObjectToXml(object obj,string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(obj.GetType());
StreamWriter _StreamWriter = new StreamWriter(FilePath);
_XmlSerializer.Serialize(_StreamWriter, obj);
} public static object XmlToObject(Type _Type, string FilePath)
{
XmlSerializer _XmlSerializer = new XmlSerializer(_Type);
FileStream _FileStream = new FileStream(FilePath, FileMode.Open);
return _XmlSerializer.Deserialize(_FileStream);
} #endregion #region 二进制序列化 public void ObjectToBin(object obj, string FilePath)
{
IFormatter formatter = new BinaryFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
formatter.Serialize(_FileStream, obj);
}
} public object BinToObject(string FilePath)
{
IFormatter formatter = new BinaryFormatter();
if (File.Exists(FilePath))
{
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
_FileStream.Position = 0;
_FileStream.Seek(0, SeekOrigin.Begin);
return (object)formatter.Deserialize(_FileStream);
}
}
else
{
return null;
}
} #endregion #region SOAP序列化 public static void ObjectToSoap(object obj, string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Create,
System.IO.FileAccess.Write,
System.IO.FileShare.None
))
{
formatter.Serialize(_FileStream, obj);
} } public static object SoapToObject(string FilePath)
{
IFormatter formatter = new SoapFormatter();
using (FileStream _FileStream = new System.IO.FileStream(FilePath,
System.IO.FileMode.Open,
System.IO.FileAccess.Read,
System.IO.FileShare.None
))
{
return (object)formatter.Deserialize(_FileStream);
}
} #endregion }
}
(每一个图标控件和连线都是独立的一个类)
还有其他的方法吗?
(每一个图标控件和连线都是独立的一个类)
还有其他的方法吗?
(每一个图标控件和连线都是独立的一个类)
还有其他的方法吗?
(每一个图标控件和连线都是独立的一个类)
还有其他的方法吗?
反射访问元数据有的东西,动态加的不在元数据里如果panel上的东西是用户后面自己添加的,保存后不能通过反射还原吧
可以把panel上的控件保存到一个集合,序列化保存,窗体加载的时候反序列化,自己再加进去图标和线都是类的化,深序列化好了 ,图片也可以序列化反序列
class MyForm : System.Windows.Forms.Form, IXmlSerializable
然后在WriteXml方法里读枚举所有控件写到xml里,在ReadXml方法根据xml再生成控件层次。