プログラムでダンプ

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に似てるのもたまたまと言われても文句は言えない。

づつく...