プログラムでダンプ
CLR型としてのシリアライズの挙動はどうなってんでしょうか。
using Microsoft.SqlServer.Types; using System.Data.SqlTypes; using System.Xml.Serialization; using System.Runtime.Serialization.Formatters.Soap; using System.IO; namespace GeomGeogTypes1 { class Program { static void Main(string[] args) { // (1)Point作る SqlGeometry geomPoint = SqlGeometry.STGeomFromText(new SqlChars("POINT(35 135)"), 4326); SqlGeography geogPoint = SqlGeography.STGeomFromText(new SqlChars("POINT(35 136)"), 4326); // (2)XMLシリアライズする Console.WriteLine("\n### GeometryをXML化 ###"); XmlSerializer geomSerializer = new XmlSerializer(typeof(SqlGeometry)); geomSerializer.Serialize(Console.Out, geomPoint); Console.WriteLine("\n### GeographyをXML化 ###"); XmlSerializer geogSerializer = new XmlSerializer(typeof(SqlGeography)); geogSerializer.Serialize(Console.Out, geogPoint); // (3)GMLに変換する Console.WriteLine("\n### GeometryをGML化 ###"); Console.WriteLine("{0}", geomPoint.AsGml().Value); Console.WriteLine("\n### GeographyをGML化 ###"); Console.WriteLine("{0}", geogPoint.AsGml().Value); // (4)SOAPシリアライズする SoapFormatter soapFmtr = new SoapFormatter(); Console.WriteLine("\n### GeometryをSOAP永続化 ###"); using (MemoryStream ms = new MemoryStream()) { try { soapFmtr.Serialize(ms, geomPoint); } catch (Exception e) { Console.WriteLine("はうっ、{0}ですぅ〜", e.Message); } } // (5)バイナリにシリアライズ Console.WriteLine("\n### Geometry.Writeでシリアライズ ###"); using (MemoryStream ms = new MemoryStream()) { BinaryWriter bw = new BinaryWriter(ms); BinaryReader br = new BinaryReader(ms); geomPoint.Write(bw); long cnt = ms.Position; for (ms.Position = 0; cnt > ms.Position;) { Console.Write(br.ReadByte().ToString("X2")); } } Console.ReadKey(); } } }
実行結果はこうなる。
### GeometryをXML化 ### <?xml version="1.0" encoding="shift_jis"?> <SqlGeometry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="h tp://www.w3.org/2001/XMLSchema"> <STSrid>4326</STSrid> </SqlGeometry> ### GeographyをXML化 ### <?xml version="1.0" encoding="shift_jis"?> <SqlGeography xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" ttp://www.w3.org/2001/XMLSchema"> <STSrid>4326</STSrid> </SqlGeography> ### GeometryをGML化 ### <?xml version="1.0" encoding="utf-8"?><Point xmlns="http://www.opengis.net/gml" <pos>35 135</pos></Point> ### GeographyをGML化 ### <?xml version="1.0" encoding="utf-8"?><Point xmlns="http://www.opengis.net/gml" <pos>35 136</pos></Point> ### GeometryをSOAP永続化 ### はうっ、アセンブリ 'Microsoft.SqlServer.Types, Version=10.0.0.0, Culture=neutra , PublicKeyToken=89845dcd8080cc91' の型 'Microsoft.SqlServer.Types.GeometryData はシリアル化可能として設定されていません。ですぅ〜 ### SqlGeometry.Writeでシリアライズ ### E6100000010C00000000008041400000000000E06040
XmlSerializerの無意味っぷりが清々しいです。空間型のValueObjectは自分で書いたほうがよさげ、いうことでしょうか。 最後はさっき見たBinary形式で出てるわけですが、SqlGeometry.Writeはドキュメントに説明が見当たらない以上、WKBに似てるのもたまたまと言われても文句は言えない。
づつく...