泛型類序列化
- 泛型類可以標記為可序列化,但只有當泛型型別引數可序列化時,泛型類才可序列化。如下:
class One
{
public string Name { get; set; }
}
[Serializable]
class Program<T>
{
public T Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Program<One> pro = new Program<One>();
BinaryFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
try
{
formatter.Serialize(stream, pro);
}
catch (SerializationException ex)
{
// 程式集“MyConsoleApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中的類 // 型“MyConsoleApplication.One”未標記為可序列化。
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
為了使泛型類可以序列化,有以下幾種方法:
- 將泛型型別引數定義的成員變數標識為NonSerialized,這樣泛型型別引數的型別就不會影響到泛型類的序列化。
class One
{
public string Name { get; set; }
}
[Serializable]
class Program<T>
{
// T不會影響Program序列化,因為此成員變數被標識為不可序列化
[NonSerialized]
public T Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Program<One> pro = new Program<One>();
BinaryFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
formatter.Serialize(stream, pro);
Console.ReadLine();
}
} - 將泛型型別引數進行約束,使其必須繼承ISerializable。
class One : ISerializable
{
public string Name { get; set; }
#region ISerializable 成員
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Name", Name);
}
#endregion
protected One(SerializationInfo info, StreamingContext context)
{
Name = info.GetString("Name");
}
}
[Serializable]
class Program<T> where T : ISerializable
{
public T Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Program<One> pro = new Program<One>();
BinaryFormatter formatter = new BinaryFormatter();
Stream stream = new MemoryStream();
formatter.Serialize(stream, pro);
Console.ReadLine();
}
} - 為泛型類新增靜態初始化器,進行泛型型別引數檢查,如果是不可序列化,則丟擲SerializationException異常。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> class One
{
public string Name { get; set; }
}
[Serializable]
class Program<T>
{
static Program()
{
ContrainType(typeof(T));
}
static void ContrainType(Type type)
{
if (!type.IsSerializable)
{
throw new SerializationException(type.Name + "不可序列化");
}
if (type.IsGenericType)
{
Type[] typeArr = type.GetGenericArguments();
Array.ForEach(typeArr, ContrainType);
}
}
public T Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
try
{
Program<One> pro = new Program<One>();
}
catch (Exception ex)
{
// “MyConsoleApplication.Program`1”的型別初始值設定項引發異常。
Console.WriteLine(ex.Message);
// One不可序列化
Console.WriteLine(ex.InnerException.Message);
}
Console.ReadLine();
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-617464/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 泛型類和泛型方法泛型
- 泛型類、泛型方法及泛型應用泛型
- TypeScript 泛型介面和泛型類TypeScript泛型
- Java泛型知識點:泛型類、泛型介面和泛型方法Java泛型
- 泛型類及系統中常用的泛型類泛型
- JAVA泛型類Java泛型
- 泛型類派生子類泛型
- 泛型,內部類泛型
- 【譯】在非泛型類中建立泛型方法泛型
- 泛型類、泛型方法、型別萬用字元的使用泛型型別字元
- 匿名內部類泛型泛型
- TS系列之介面/類/泛型泛型
- C#泛型類之LISTC#泛型
- 開發積累—泛型工具類泛型
- C# 泛型 基類約束C#泛型
- JAVA API:ArrayList(泛型類)基本使用JavaAPI泛型
- TS類,介面,泛型的簡介泛型
- C# 中使物件序列化/反序列化 Json 支援使用派生型別以及泛型的方式C#物件JSON型別泛型
- 泛型的型別擦除後,fastjson反序列化時如何還原?泛型型別ASTJSON
- dart系列之:dart類中的泛型Dart泛型
- Dart4Flutter – 03 – 類和泛型DartFlutter泛型
- 集合框架-泛型類的概述及使用框架泛型
- 如何用反射呼叫泛型類的方法反射泛型
- C#類繼承自泛型集合C#繼承泛型
- 【java】【泛型】泛型geneticJava泛型
- java泛型之泛型方法。Java泛型
- 泛型--泛型萬用字元和泛型的上下限泛型字元
- 重拾TypeScript-21 類中使用泛型TypeScript泛型
- Java泛型(類、介面、方法)及萬用字元Java泛型字元
- JDBC泛型類反射封裝結果集JDBC泛型反射封裝
- java 匿名 泛型 獲取真實類名Java泛型
- Go 泛型之泛型約束Go泛型
- java泛型之泛型陣列。Java泛型陣列
- 泛型泛型
- c#中判斷類是否繼承於泛型基類C#繼承泛型
- 泛型最佳實踐:Go泛型設計者教你如何用泛型泛型Go
- Hibernate 泛型實現 dao 層的基類泛型
- 型別 VS 泛型型別泛型