WCF 服務常需傳遞結構化資料。DataSet、DataTable 為 ADO.NET 核心類型,List<T> 為通用集合,三者序列化行為差異大,影響跨平台互通性。
MarshalByValueComponent,實作 ISerializable、IXmlSerializable,預設可序列化。List<User> → 客戶端反序列化為 User[] (陣列)。List<T>、Collection<T>、BindingList<T>、Dictionary<K,V> (序列化為 ArrayOfKeyValueOfKV)。[DataContract]) 或可序列化型別。[ServiceContract]
public interface IDataService
{
[OperationContract] DataTable GetByTable();
[OperationContract] DataSet GetByDataSet();
[OperationContract] List<User> GetByCollection();
}
[DataContract]
public class User { [DataMember] public string Name; [DataMember] public int Age; }
客戶端 Proxy 產生:
DataTable GetByTable()、DataSet GetByDataSet()、User[] GetByCollection()。注意集合變陣列。
List<T> 方便操作,客戶端接收陣列 T[] 即可,或透過 CollectionDataContract 自訂集合型別。DataSet/DataTable 適合 .NET 內部快速原型,但序列化開銷大、耦合資料庫結構、跨平台困難。正式 SOA 系統應採用明確的資料合約 (DataContract) 設計,確保版本演進與異構互通。