オブジェクトのシリアライズ
型付DataSetが使えない場合のことも考えて他の案も調査することに。S2Dao.NETを使った場合、Pureなクラスを扱うことになります。サーバー側のロジックを組む分には、こっちの方が都合が良いくらいなんですが、これをクライアントに返すときにが問題。型毎にWebMethodを用意したくないので、クライアント-サーバ間のやり取りはDataSetにしてしまうつもりです。なので、クラスからDataSet(XML)に変換する必要があります。
何も考えずに、SoapFormatterを使ってシリアライズ。
IList list = UserDao.GetAllList (); User[] users = new Users [list.Count]; list.CopyTo (users, 0); SoapFormatter formatter = new SoapFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, users); stream.Close();
しかし、
System.Runtime.Serialization.SerializationException: Soap シリアライザでは、ジェネリック タイプ System.Nullable`1[System.Decimal] の シリアル化がサポートされていません。
Nullableは駄目とのこと。
色々調べていたらXmlSerializerを発見。私はSystem.Xml名前空間ってほとんど知らないんですよね。(^^;
IList list = UserDao.GetAllList (); User[] users = new Users [list.Count]; list.CopyTo (users, 0); XmlSerializer xs = new XmlSerializer (users.GetType()); MemoryStream stream = new MemoryStream (); xs.Serialize (stream, users); DataSet dsUsers = new DataSet (); stream.Seek (0, SeekOrigin.Begin); dsUsers.ReadXml(stream); stream.Close();
とりあえず、これで何とかなったっぽい。もうちょっと調べないと心配ですが・・・