Index: trunk/Include/Classes/ActiveBasic/Core/TypeInfo.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Core/TypeInfo.ab	(revision 451)
+++ trunk/Include/Classes/ActiveBasic/Core/TypeInfo.ab	(revision 452)
@@ -17,4 +17,5 @@
 	memberNames As *String				' 名前リスト
 	memberTypeFullNames As *String		' 型名リスト
+	memberOffsets As *LONG_PTR			' クラスの先頭ポインタからのオフセット値
 	memberCounts As Long				' 個数
 	memberInfosCache As System.Collections.Generic.List<System.Reflection.MemberInfo>
@@ -46,5 +47,5 @@
 		Dim result = New TypeBaseImpl( strNamespace, name, fullName )
 		result.SetBaseType( baseType )
-		result.SetMembers( memberNames, memberTypeFullNames, memberCounts )
+		result.SetMembers( memberNames, memberTypeFullNames, memberOffsets, memberCounts )
 		result.memberInfosCache = This.memberInfosCache
 		result.ptrLevel = This.ptrLevel
@@ -54,7 +55,8 @@
 Public
 
-	Sub SetMembers( memberNames As *String, memberTypeFullNames As *String, num As Long )
+	Sub SetMembers( memberNames As *String, memberTypeFullNames As *String, memberOffsets As *LONG_PTR, num As Long )
 		This.memberNames = memberNames
 		This.memberTypeFullNames = memberTypeFullNames
+		This.memberOffsets = memberOffsets
 		This.memberCounts = num
 
@@ -146,5 +148,5 @@
 			Dim i As Long
 			For i=0 To ELM(memberCounts)
-				memberInfosCache.Add( New System.Reflection.MemberInfo( memberNames[i], _System_TypeBase_Search( memberTypeFullNames[i] ) ) )
+				memberInfosCache.Add( New System.Reflection.MemberInfo( memberNames[i], _System_TypeBase_Search( memberTypeFullNames[i] ), memberOffsets[i] ) )
 			Next
 		End If
Index: trunk/Include/Classes/ActiveBasic/Xml/Parser.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Xml/Parser.ab	(revision 452)
+++ trunk/Include/Classes/ActiveBasic/Xml/Parser.ab	(revision 452)
@@ -0,0 +1,13 @@
+Namespace ActiveBasic	
+Namespace Xml
+
+
+Class Parser
+Public
+	Static Function Parse( xmlString As String, doc As System.Xml.XmlDocument ) As Boolean
+	End Function
+End Class
+
+
+End Namespace
+End Namespace
Index: trunk/Include/Classes/System/Reflection/MemberInfo.ab
===================================================================
--- trunk/Include/Classes/System/Reflection/MemberInfo.ab	(revision 451)
+++ trunk/Include/Classes/System/Reflection/MemberInfo.ab	(revision 452)
@@ -9,4 +9,5 @@
 	name As String
 	memberType As TypeInfo
+	offset As LONG_PTR
 Public
 
@@ -16,12 +17,13 @@
 			memberType メンバの型
 	*/
-	Sub MemberInfo( name As String, memberType As TypeInfo )
+	Sub MemberInfo( name As String, memberType As TypeInfo, offset As LONG_PTR )
 		This.name = name
 		This.memberType = memberType
+		This.offset = offset
 	End Sub
 
 	/*!
-	@brief	メンバの名前を取得する
-	@return	メンバの名前
+	@brief	メンバの名前を取得する。
+	@return	メンバの名前。
 	*/
 	Function Name() As String
@@ -30,9 +32,17 @@
 
 	/*!
-	@brief	メンバの型を取得する
-	@return	メンバの型
+	@brief	メンバの型を取得する。
+	@return	メンバの型。
 	*/
 	Function MemberType() As TypeInfo
 		Return memberType
+	End Function
+
+	/*!
+	@brief	クラスの先頭ポインタからのオフセット値を取得する。
+	@return	クラスの先頭ポインタからのオフセット値。
+	*/
+	Function _System_Offset() As LONG_PTR
+		Return offset
 	End Function
 End Class
Index: trunk/Include/Classes/System/Xml/Serialization/XmlSerializer.ab
===================================================================
--- trunk/Include/Classes/System/Xml/Serialization/XmlSerializer.ab	(revision 452)
+++ trunk/Include/Classes/System/Xml/Serialization/XmlSerializer.ab	(revision 452)
@@ -0,0 +1,128 @@
+Namespace System
+Namespace Xml
+Namespace Serialization
+
+
+Class XmlSerializer
+	m_typeInfo As System.TypeInfo
+
+	Static Sub SerializeForBasicType( typeInfo As TypeInfo, memoryOffset As LONG_PTR, o As Object, doc As XmlDocument, parentNode As XmlNode )
+		Dim valueStr = Nothing As String
+		If typeInfo.FullName = "Byte" Then
+			valueStr = Str$( GetByte( ObjPtr( o ) + memoryOffset ) As Byte )
+		ElseIf typeInfo.FullName = "SByte" Then
+			valueStr = Str$( GetByte( ObjPtr( o ) + memoryOffset ) As SByte )
+		ElseIf typeInfo.FullName = "Word" Then
+			valueStr = Str$( GetWord( ObjPtr( o ) + memoryOffset ) As Word )
+		ElseIf typeInfo.FullName = "Integer" Then
+			valueStr = Str$( GetWord( ObjPtr( o ) + memoryOffset ) As Integer )
+		ElseIf typeInfo.FullName = "DWord" Then
+			valueStr = Str$( GetDWord( ObjPtr( o ) + memoryOffset ) As DWord )
+		ElseIf typeInfo.FullName = "Long" Then
+			valueStr = Str$( GetDWord( ObjPtr( o ) + memoryOffset ) As Long )
+		ElseIf typeInfo.FullName = "QWord" Then
+			valueStr = Str$( GetQWord( ObjPtr( o ) + memoryOffset ) As QWord )
+		ElseIf typeInfo.FullName = "Int64" Then
+			valueStr = Str$( GetQWord( ObjPtr( o ) + memoryOffset ) As Int64 )
+		ElseIf typeInfo.FullName = "Boolean" Then
+			If GetByte( ObjPtr( o ) + memoryOffset ) As Boolean Then
+				valueStr = "True"
+			Else
+				valueStr = "False"
+			End If
+		ElseIf typeInfo.FullName = "Single" Then
+			valueStr = Str$( GetSingle( ObjPtr( o ) + memoryOffset ) As Single )
+		ElseIf typeInfo.FullName = "Double" Then
+			valueStr = Str$( GetDouble( ObjPtr( o ) + memoryOffset ) As Double )
+		ElseIf typeInfo.FullName = "VoidPtr" Then
+			valueStr = Str$( Get_LONG_PTR( ObjPtr( o ) + memoryOffset ) )
+		Else
+			Throw
+		End If
+
+		Dim childNode = doc.CreateElement( typeInfo.FullName )
+		parentNode.AppendChild( childNode )
+		childNode.AppendChild( doc.CreateTextNode( valueStr ) )
+
+	End Sub
+
+	Static Sub SerializeForClass( typeInfo As TypeInfo, o As Object, doc As XmlDocument, parentNode = Nothing As XmlNode )
+		If typeInfo.IsClass() and typeInfo.FullName = "System.Object" Then
+			' Object型はシリアライズしない
+			Return
+		End If
+
+		If ActiveBasic.IsNothing( parentNode ) Then
+			parentNode = doc
+		End If
+
+		Dim memberInfos = typeInfo.GetMembers()
+
+		' 子ノードを生成
+		Dim childNode = doc.CreateElement( typeInfo.Name )
+		Dim namespaceAttr = doc.CreateAttribute( "namespace" )
+		namespaceAttr.Value = typeInfo.Namespace
+		childNode.Attributes.Add( namespaceAttr )
+
+		' 親ノードへ追加
+		parentNode.AppendChild( childNode )
+
+		If Not ActiveBasic.IsNothing( typeInfo.BaseType ) Then
+			' 基底クラスが存在するとき
+
+			' 基底クラスをシリアライズ
+			SerializeForClass( typeInfo.BaseType, o, doc, childNode )
+		End If
+
+		' メンバをシリアライズ
+		Foreach memberInfo In memberInfos
+			If memberInfo.MemberType.IsPointer() Then
+				Throw
+			ElseIf memberInfo.MemberType.IsClass() Then
+				SerializeForClass( memberInfo.MemberType, o, doc, childNode )
+			ElseIf memberInfo.MemberType.IsValueType() Then
+				SerializeForBasicType( memberInfo.MemberType, memberInfo._System_Offset, o, doc, childNode )
+			End If
+		Next
+	End Sub
+
+	Function Deserialize( doc As XmlDocument ) As Object
+	End Function
+
+Public
+	Sub XmlSerializer( typeInfo As System.TypeInfo )
+		This.m_typeInfo = typeInfo
+	End Sub
+	Sub ~XmlSerializer()
+	End Sub
+
+
+	/*!
+	@brief	XML文書をオブジェクトに逆シリアライズします。
+	@author	Daisuke Yamamoto
+	*/
+	Function Deserialize( stream As System.IO.Stream ) As Object
+		Dim doc = New XmlDocument
+		doc.Load( stream )
+		Deserialize( doc )
+	End Function
+
+	/*!
+	@brief	オブジェクトをXML文書にシリアライズします。
+	@author	Daisuke Yamamoto
+	*/
+	Sub Serialize( stream As System.IO.Stream, o As Object )
+		Dim doc = New XmlDocument
+		doc.AppendChild( doc.CreateXmlDeclaration( "1.0", "shift-jis", Nothing ) )
+
+		SerializeForClass( m_typeInfo, o, doc )
+
+		' ストリームに保存
+		doc.Save( stream )
+	End Sub
+End Class
+
+
+End Namespace
+End Namespace
+End Namespace
Index: trunk/Include/Classes/System/Xml/XmlDocument.ab
===================================================================
--- trunk/Include/Classes/System/Xml/XmlDocument.ab	(revision 451)
+++ trunk/Include/Classes/System/Xml/XmlDocument.ab	(revision 452)
@@ -94,4 +94,28 @@
 
 	/*!
+	@brief	指定したストリームからXML文書を読み込む。
+	@param	stream 読み込み先のストリーム。
+	*/
+	Virtual Sub Load( inStream As System.IO.Stream )
+		Dim length = inStream.Length As DWord
+		Dim xmlBuffer = calloc( length + 1 ) As *StrChar
+		inStream.Read( xmlBuffer As *Byte, 0, length )
+		Dim xmlString = New String( xmlBuffer )
+		free( xmlBuffer )
+
+		This.RemoveAll()
+		ActiveBasic.Xml.Parser.Parse( xmlString, This )
+	End Sub
+
+	/*!
+	@brief	指定したファイルからXML文書を読み込む。
+	@param	ファイルパス。
+	*/
+	Virtual Sub Load( filename As String )
+		Dim fileStream As System.IO.FileStream( filename, System.IO.FileMode.Open, System.IO.FileAccess.Read )
+		Load( fileStream )
+	End Sub
+
+	/*!
 	@brief	指定したストリームにXML文書を保存する。
 	@param	stream 保存先のストリーム。
@@ -107,8 +131,11 @@
 	*/
 	Virtual Sub Save( filename As String )
-		Dim fileStream As System.IO.FileStream( filename, System.IO.FileMode.Create )
+		Dim fileStream As System.IO.FileStream( filename, System.IO.FileMode.Create, System.IO.FileAccess.Write )
 		Save( fileStream )
 	End Sub
 
+Private
+	Sub LoadXmlString( xmlString As String)
+	End Sub
 End Class
 
Index: trunk/Include/Classes/index.ab
===================================================================
--- trunk/Include/Classes/index.ab	(revision 451)
+++ trunk/Include/Classes/index.ab	(revision 452)
@@ -9,4 +9,5 @@
 #require "./ActiveBasic/Windows/WindowHandle.sbp"
 #require "./ActiveBasic/Windows/Windows.ab"
+#require "./ActiveBasic/Xml/Parser.ab"
 #require "./System/Blittable.ab"
 #require "./System/Console.ab"
@@ -105,2 +106,3 @@
 #require "./System/Xml/XmlNode.ab"
 #require "./System/Xml/XmlText.ab"
+#require "./System/Xml/Serialization/XmlSerializer.ab"
