共用方式為


序列化和中繼資料

如果您的應用程式將物件序列化和還原序列化,您可能需要將項目加入至執行階段指示詞 (.rd.xml) 檔案,以確保執行階段有必要的中繼資料存在。 有兩種類別的序列化程式,在執行階段指示詞檔案中,各需要不同的處理:

  • 反映型協力廠商序列化程式。 這些序列化程式需要修改您的執行階段指示詞檔案,將在下一節中討論。

  • 您可以在 .NET Framework 類別庫中找到非反映型序列化程式。 這些序列化程式可能需要修改您的執行階段指示詞檔案,將在 Microsoft 序列化程式一節中討論。

協力廠商序列化程式

協力廠商序列化程式 (包括 Newtonsoft.JSON) 通常是反映型。 若指定序列化資料的二進位大型物件 (BLOB),將會依名稱查閱目標類型的欄位,以將資料中的欄位指派給具象類型。 針對您嘗試在 List<Type> 集合中序列化或還原序列化的每個 Type 物件,使用這些程式庫至少會導致 MissingMetadataException 例外狀況。

若要為這些序列化程式解決因遺失中繼資料而導致的問題,最簡單的方法,就是收集要在單一命名空間 (例如 App.Models) 之下用於序列化的類型,並套用 Serialize 中繼資料指示詞:

<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />

如需範例中所使用語法的資訊,請參閱 <Namespace> 項目

Microsoft 序列化程式

雖然 DataContractSerializerDataContractJsonSerializerXmlSerializer 類別不會依賴反映,但確實需要根據所要序列化或還原序列化的物件來產生程式碼。 適用於每個序列化程式的多載建構函式,包括用來指定要序列化或還原序列化之類型的 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> 項目

另請參閱