C#自定義序列化ISerializable的實現(xiàn)方法
更新時間:2015年04月28日 10:58:35 作者:igoo
這篇文章主要介紹了C#自定義序列化ISerializable的實現(xiàn)方法,涉及C#序列化的操作技巧,非常具有實用價值,需要的朋友可以參考下
本文實例講述了C#自定義序列化ISerializable的實現(xiàn)方法。分享給大家供大家參考。具體實現(xiàn)方法如下:
[Serializable]
public class BaseObject
{
[OptionalField]
private string _str = "I am BaseObject";
}
[Serializable]
public class TestObject : BaseObject, ISerializable
{
int a;
string strName = "";
Color c = Color.Red;
DataTable _dtColors = null;
[OptionalField]
ArrayList list = new ArrayList();
[OptionalField]
List<int> list1 = new List<int>();
[OptionalField]
Dictionary<int, string> dic = new Dictionary<int, string>();
//當實現(xiàn)ISerializable接口時,如果該構(gòu)造函數(shù)不存在,則會引發(fā)一個SerializationException異常
//該特性表示,該方法只允許序列化器調(diào)
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter = true)]
protected TestObject(SerializationInfo info, StreamingContext context)
{
#region 如果基類也實現(xiàn)了ISerializable接口,則序列化器會自動調(diào)用基類的該構(gòu)造函數(shù),就不需要本段代碼
Type basetype = this.GetType().BaseType;
MemberInfo[] mi = FormatterServices.GetSerializableMembers(basetype, context);
for (int i = 0; i < mi.Length; i++)
{
//由于AddValue不能添加重名值,為了避免子類變量名與基類變量名相同,將基類序列化的變量名加上基類類名
FieldInfo fi = (FieldInfo)mi[0];
object objValue = info.GetValue(basetype.FullName + "+" + fi.Name, fi.FieldType);
fi.SetValue(this, objValue);
}
#endregion
a = info.GetInt32("a");
strName = info.GetString("strName");
c = (Color)info.GetValue("c", typeof(Color));
_dtColors = (DataTable)info.GetValue("_dtColors", typeof(DataTable));
list = (ArrayList)info.GetValue("list", typeof(ArrayList));
list1 = (List<int>)info.GetValue("list1", typeof(List<int>));
dic = (Dictionary<int, string>)info.GetValue("dic", typeof(Dictionary<int, string>));
}
public TestObject()
{
a = 100;
strName = "daps";
InitColorTable();
list1.Add(10);
list1.Add(20);
}
#region ISerializable 成員
[SecurityPermissionAttribute(SecurityAction.Demand, SerializationFormatter =true)]
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("a", a);
info.AddValue("strName", strName);
info.AddValue("c", c);
info.AddValue("_dtColors", _dtColors);
info.AddValue("list", list);
info.AddValue("list1", list1);
info.AddValue("dic", dic);
Type basetype = this.GetType().BaseType;
MemberInfo[] mi = FormatterServices.GetSerializableMembers(basetype, context);
for (int i = 0; i < mi.Length; i++)
{
//由于AddValue不能添加重名值,為了避免子類變量名與基類變量名相同,將基類序列化的變量名加上基類類名
info.AddValue(basetype.FullName + "+" + mi[i].Name, ((FieldInfo)mi[i]).GetValue(this));
}
}
#endregion
}
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
VsCode使用EmmyLua插件調(diào)試Unity工程Lua代碼的詳細步驟
這篇文章主要介紹了VsCode使用EmmyLua插件調(diào)試Unity工程Lua代碼,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
C#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受的方法
這篇文章主要介紹了c#使用TCP協(xié)議實現(xiàn)數(shù)據(jù)發(fā)送和接受,使用TCP協(xié)議實現(xiàn)數(shù)據(jù)的發(fā)送和接受包括客戶端和服務(wù)端兩個部分,本文通過實例代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04

