序列化和中繼資料
如果您的應用程式將物件序列化和還原序列化,您可能需要將項目加入至執行階段指示詞 (.rd.xml) 檔案,以確保執行階段有必要的中繼資料存在。 有兩種類別的序列化程式,在執行階段指示詞檔案中,各需要不同的處理:
反映型協力廠商序列化程式。 這些序列化程式需要修改您的執行階段指示詞檔案,將在下一節中討論。
您可以在 .NET Framework 類別庫中找到非反映型序列化程式。 這些序列化程式可能需要修改您的執行階段指示詞檔案,將在 Microsoft 序列化程式一節中討論。
協力廠商序列化程式
協力廠商序列化程式 (包括 Newtonsoft.JSON) 通常是反映型。 若指定序列化資料的二進位大型物件 (BLOB),將會依名稱查閱目標類型的欄位,以將資料中的欄位指派給具象類型。 針對您嘗試在 List<Type>
集合中序列化或還原序列化的每個 Type 物件,使用這些程式庫至少會導致 MissingMetadataException 例外狀況。
若要為這些序列化程式解決因遺失中繼資料而導致的問題,最簡單的方法,就是收集要在單一命名空間 (例如 App.Models
) 之下用於序列化的類型,並套用 Serialize
中繼資料指示詞:
<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />
如需範例中所使用語法的資訊,請參閱 <Namespace> 項目。
Microsoft 序列化程式
雖然 DataContractSerializer、DataContractJsonSerializer 和 XmlSerializer 類別不會依賴反映,但確實需要根據所要序列化或還原序列化的物件來產生程式碼。 適用於每個序列化程式的多載建構函式,包括用來指定要序列化或還原序列化之類型的 Type 參數。 您用來將該類型指定在程式碼中的方式,會定義您必須採取的動作,在下兩節中將進行討論。
用於建構函式的 typeof
如果您呼叫這些序列化類別的建構函式,並將 C# typeof 運算子包含在方法呼叫中,就不需要執行任何額外的工作。 例如,在對序列化類別建構函式進行的下列每個呼叫中,typeof
關鍵字會用來做為傳遞至建構函式之運算式的一部分。
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));
.NET Native 編譯器將會自動處理這個程式碼。
在建構函式外部使用的 typeof
如果您呼叫這些序列化類別的建構函式,並且在提供給建構函式之 Type 參數的運算式外部,使用 C# typeof 運算子 (如下列程式碼所示),則 .NET Native 編譯器無法解析類型:
Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);
在此情況下,您必須加入像下列這樣的項目,以在執行階段指示詞檔案中指定類型:
<Type Name="DataSet" Browse="Required Public" />
同樣地,如果您呼叫 XmlSerializer(Type, Type[]) 之類的建構函式,並提供要序列化的其他 Type 物件陣列 (如下列程式碼),則 .NET Native 編譯器無法解析這些類型。
XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
new Type[] { typeof(Student),
typeof(Course),
typeof(Location) });
針對每一種類型,在執行階段指示詞檔案中加入像下列的項目:
<Type Name="t" Browse="Required Public" />
如需範例中所使用語法的資訊,請參閱 <Type> 項目。