日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]自定义序列化对象

發(fā)布時(shí)間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]自定义序列化对象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
很多時(shí)候,我們需要將對(duì)象序列化成字符串保存到內(nèi)存、磁盤或者?Page.ViewState?中。基于種種原因,我們希望序列化結(jié)果盡可能小,盡可能簡(jiǎn)單,即便用其他的方法(比如正則表達(dá)式)也能解析出數(shù)據(jù)。BinaryFormatter?的結(jié)果轉(zhuǎn)換成字符串(或者Base64)長(zhǎng)度太大,而?XmlSerializer?對(duì)數(shù)據(jù)類型支持有限,顯然內(nèi)置的序列化引擎不足以滿足我們的需求,還是自己豐衣足食。

下面的代碼可能還不完善,僅供參考,內(nèi)容比較簡(jiǎn)單,不做詳述。

/**////?<summary>
///?序列化
///?</summary>

public?static?string?SerializeObject(object?o)
{
??
char?sep1?=?'|';
??
char?sep2?=?',';
??
char?sep3?=?'=';

??StringBuilder?sb?
=?new?StringBuilder();

??FieldInfo[]?fields?
=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);

??
foreach?(FieldInfo?field?in?fields)
??
{
????
object?value?=?field.GetValue(o);

????
if?(value?!=?null)
????
{
??????
if?(field.FieldType.GetInterface("IDictionary")?!=?null)
??????
{
????????
foreach?(object?key?in?(value?as?IDictionary).Keys)
????????
{
??????????sb.AppendFormat(
"{0}{3}{1}{2}",?key,?(value?as?IDictionary)[key],?sep2,?sep3);
????????}


????????
if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}

??????
else?if?(field.FieldType.GetInterface("IList")?!=?null)
??????
{
????????
foreach?(object?v?in?(value?as?IList))
????????
{
??????????sb.AppendFormat(
"{0}{1}",?v,?sep2);
????????}


????????
if?(sb[sb.Length?-?1]?==?sep2)?sb.Remove(sb.Length?-?1,?1);
??????}

??????
else?if?(field.FieldType?==?typeof(Boolean))
??????
{
????????sb.Append((
bool)value???"T"?:?"");
??????}

??????
else
??????
{
????????sb.Append(value);
??????}

????}


????sb.Append(sep1);
??}


??
if?(sb[sb.Length?-?1]?==?sep1)?sb.Remove(sb.Length?-?1,?1);
??
return?sb.ToString();
}


/**////?<summary>
///?反序列化
///?</summary>

public?static?T?DeserializeObject<T>(string?s)
??where?T?:?
new()
{
??
char?sep1?=?'|';
??
char?sep2?=?',';
??
char?sep3?=?'=';

??T?o?
=?new?T();

??FieldInfo[]?fields?
=?o.GetType().GetFields(BindingFlags.Instance?|?BindingFlags.Public?|?
????BindingFlags.NonPublic);

??
string[]?values?=?s.Split(sep1);

??
for?(int?i?=?0;?i?<?fields.Length;?i++)
??
{
????FieldInfo?field?
=?fields[i];
????
if?(String.IsNullOrEmpty(values[i]))?continue;

????
if?(field.FieldType.GetInterface("IDictionary")?!=?null)
????
{
??????
string[]?vs?=?values[i].Split(sep2);

??????IDictionary?dictionary?
=?field.GetValue(o)?as?IDictionary;

??????Type?key?
=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[
0]?:?typeof(Object);
??????Type?value?
=?field.FieldType.IsGenericType???
????????field.FieldType.GetGenericArguments()[
1]?:?typeof(Object);

??????
if?(dictionary?==?null)
??????
{
????????dictionary?
=?(IDictionary)Activator.CreateInstance(field.FieldType);
????????field.SetValue(o,?dictionary);
??????}


??????
foreach?(string?v?in?vs)
??????
{
????????
string[]?ns?=?v.Split(sep3);
????????dictionary.Add(Convert.ChangeType(ns[
0],?key),?Convert.ChangeType(ns[1],?value));
??????}

????}

????
else?if?(field.FieldType.GetInterface("IList")?!=?null)
????
{
??????
string[]?vs?=?values[i].Split(sep2);

??????
if?(field.FieldType.IsArray)
??????
{
????????Type?t?
=?field.FieldType.GetElementType();
????????Array?array?
=?Array.CreateInstance(t,?vs.Length);

????????
for?(int?x?=?0;?x?<?vs.Length;?x++)
????????
{
??????????array.SetValue(Convert.ChangeType(vs[x],?t),?x);
????????}


????????field.SetValue(o,?array);
??????}

??????
else
??????
{
????????IList?list?
=?field.GetValue(o)?as?IList;

????????Type?t?
=?field.FieldType.IsGenericType???
??????????field.FieldType.GetGenericArguments()[
0]?:?typeof(Object);

????????
if?(list?==?null)
????????
{
??????????list?
=?(IList)Activator.CreateInstance(field.FieldType);
??????????field.SetValue(o,?list);
????????}


????????
foreach?(string?v?in?vs)
????????
{
??????????list.Add(Convert.ChangeType(v,?t));
????????}

??????}

????}

????
else?if?(field.FieldType?==?typeof(Boolean))
????
{
??????field.SetValue(o,?values[i]?
==?"T"???true?:?false);
????}

????
else?if?(field.FieldType.IsEnum)
????
{
??????field.SetValue(o,?Enum.Parse(field.FieldType,?values[i],?
true));
????}

????
else
????
{
??????field.SetValue(o,?Convert.ChangeType(values[i],?field.FieldType));
????}

??}


??
return?o;
}


測(cè)試代碼

[Serializable]
public?class?MyClass
{
??
private?int?valueType;

??
public?int?ValueType
??
{
????
get?{?return?valueType;?}
????
set?{?valueType?=?value;?}
??}


??
private?object?obj;

??
public?object?Object
??
{
????
get?{?return?obj;?}
????
set?{?obj?=?value;?}
??}


??
private?bool?boolean;

??
public?bool?Boolean
??
{
????
get?{?return?boolean;?}
????
set?{?boolean?=?value;?}
??}


??
private?string[]?array;

??
public?string[]?Array
??
{
????
get?{?return?array;?}
????
set?{?array?=?value;?}
??}


??
private?List<string>?list;

??
public?List<string>?List
??
{
????
get?{?return?list;?}
????
set?{?list?=?value;?}
??}


??
private?ArrayList?arrayList;

??
public?ArrayList?ArrayList
??
{
????
get?{?return?arrayList;?}
????
set?{?arrayList?=?value;?}
??}


??
private?Hashtable?hashtable;

??
public?Hashtable?Hashtable
??
{
????
get?{?return?hashtable;?}
????
set?{?hashtable?=?value;?}
??}


??
private?Dictionary<string,?int>?dictionary;

??
public?Dictionary<string,?int>?Dictionary
??
{
????
get?{?return?dictionary;?}
????
set?{?dictionary?=?value;?}
??}

}


class?Program
{
??
static?void?Main(string[]?args)
??
{
????
//Test();

????MyClass?o?
=?new?MyClass();
????o.List?
=?new?List<string>();
????o.Dictionary?
=?new?Dictionary<string,?int>();
????o.ArrayList?
=?new?ArrayList();
????o.Hashtable?
=?new?Hashtable();

????o.ValueType?
=?123456;
????o.Object?
=?DateTime.Now;
????o.Boolean?
=?true;

????o.Dictionary.Add(
"dict1",?1);
????o.Dictionary.Add(
"dict2",?2);
????
????o.Array?
=?new?string[]?{?"array1",?"array2",?"array3"?};
????
????o.List.Add(
"list1");
????o.List.Add(
"list2");
????
????o.ArrayList.Add(
"ArrayList1");
????o.ArrayList.Add(
"ArrayList2");
????
????o.Hashtable.Add(
"Hashtable1",?1);
????o.Hashtable.Add(
"Hashtable2",?2);

????
//?SerializeObject

????
string?s?=?SerializeObject(o);
????Console.WriteLine(s);

????MyClass?m?
=?DeserializeObject<MyClass>(s);
????Console.WriteLine(SerializeObject(m));

????
//?BinaryFormatter

????BinaryFormatter?binary?
=?new?BinaryFormatter();
????MemoryStream?stream?
=?new?MemoryStream();
????binary.Serialize(stream,?o);
????s?
=?Convert.ToBase64String(stream.ToArray());
????Console.WriteLine(s);
??}

}

總結(jié)

以上是生活随笔為你收集整理的[转]自定义序列化对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。