Properly handle subclasses of ISerializable. Blah.

This commit is contained in:
Marc 2013-05-19 18:56:50 -07:00
parent 9a334bd41a
commit 049a604fd2

View File

@ -223,6 +223,8 @@ public class XmlFormatter2 : IFormatter
return null; return null;
} }
private Type[] mm_consType = new Type[ 2 ];
private object[] mm_args = new object[ 2 ];
private object DeserializeObject( XmlElement elem, Type type ) private object DeserializeObject( XmlElement elem, Type type )
{ {
string refString = elem.GetAttribute( "ref" ); string refString = elem.GetAttribute( "ref" );
@ -249,16 +251,58 @@ public class XmlFormatter2 : IFormatter
Type typeISerializable = typeof( ISerializable ); Type typeISerializable = typeof( ISerializable );
//*
/*
if( obj is ISerializable ) // type.IsSubclassOf( typeISerializable ) ) if( obj is ISerializable ) // type.IsSubclassOf( typeISerializable ) )
{ {
XmlNodeList allChildren = elem.ChildNodes; XmlNodeList allChildren = elem.ChildNodes;
ISerializable ser = obj as ISerializable; //ISerializable ser = obj as ISerializable;
var serInfo = new SerializationInfo( type, new FormatterConverter() ); var serInfo = new SerializationInfo( finalType, new FormatterConverter() );
//var serInfoForTypes = new SerializationInfo( type, new FormatterConverter() );
//ser.GetObjectData( serInfoForTypes, Context );
foreach( var objNode in allChildren )
{
var node = objNode as XmlElement;
String name = node.Name;
String childType = node.GetAttribute( "t" );
name = name.Replace( '+', '-' );
name = name.Replace( '`', '_' );
XmlElement childElem = getNamedChild( allChildren, name );
var des = Deserialize( childElem, childType );
serInfo.AddValue( name, des, des.GetType() );
}
//ConstructorInfo[] allCons = obj.GetType().GetConstructors( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic );
//var serMem = FormatterServices.GetSerializableMembers( finalType );
//object objUn = FormatterServices.GetSafeUninitializedObject( finalType );
IDeserializationCallback objUnOnDeser = obj as IDeserializationCallback;
mm_consType[ 0 ] = typeof( SerializationInfo );
mm_consType[ 1 ] = typeof( StreamingContext );
ConstructorInfo serCons = finalType.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, mm_consType, null );
mm_args[0] = serInfo;
mm_args[1] = Context;
serCons.Invoke( obj, mm_args );
if( objUnOnDeser != null )
{
objUnOnDeser.OnDeserialization( objUnOnDeser );
}
/*
ser.GetObjectData( serInfo, Context ); ser.GetObjectData( serInfo, Context );
//var serEnum = ; //var serEnum = ;
@ -274,9 +318,9 @@ public class XmlFormatter2 : IFormatter
var des = Deserialize( childElem, name ); var des = Deserialize( childElem, name );
} }
*/
} }
else else
*/
{ {
MemberInfo[] miArr = FormatterServices.GetSerializableMembers( finalType ); MemberInfo[] miArr = FormatterServices.GetSerializableMembers( finalType );
@ -448,11 +492,11 @@ public class XmlFormatter2 : IFormatter
private void Serialize( XmlWriter writer, object root ) private void Serialize( XmlWriter writer, object root )
{ {
//writer.WriteStartDocument(); //writer.WriteStartDocument();
Serialize( writer, root, "root" ); Serialize( writer, root, "root", true );
//writer.WriteEndDocument(); //writer.WriteEndDocument();
} }
private void Serialize( XmlWriter writer, object root, string name ) private void Serialize( XmlWriter writer, object root, string name, bool forceType )
{ {
writer.WriteStartElement( name ); writer.WriteStartElement( name );
@ -464,7 +508,7 @@ public class XmlFormatter2 : IFormatter
if( typeCode != TypeCode.Object ) if( typeCode != TypeCode.Object )
{ {
SerializeConcrete( writer, root ); SerializeConcrete( writer, root, forceType );
} }
else else
{ {
@ -486,10 +530,13 @@ public class XmlFormatter2 : IFormatter
writer.WriteEndElement(); writer.WriteEndElement();
} }
private void SerializeConcrete( XmlWriter writer, object root ) private void SerializeConcrete( XmlWriter writer, object root, bool forceType )
{ {
//TODO: Only write this out if debugging. //TODO: Only write this out if debugging.
//writer.WriteAttributeString( "t", getTypeName( root.GetType() ) ); if( forceType )
{
writer.WriteAttributeString( "t", getTypeName( root.GetType() ) );
}
writer.WriteAttributeString( "v", root.ToString() ); writer.WriteAttributeString( "v", root.ToString() );
} }
@ -540,7 +587,7 @@ public class XmlFormatter2 : IFormatter
name = name.Replace( '+', '-' ); name = name.Replace( '+', '-' );
name = name.Replace( '`', '_' ); name = name.Replace( '`', '_' );
Serialize( writer, serMember.Value, name ); Serialize( writer, serMember.Value, name, true );
} }
//var sc = new SerializationContext( //var sc = new SerializationContext(
@ -568,7 +615,7 @@ public class XmlFormatter2 : IFormatter
name = name.Replace( '+', '-' ); name = name.Replace( '+', '-' );
name = name.Replace( '`', '_' ); name = name.Replace( '`', '_' );
Serialize( writer, childFi.GetValue( root ), name ); Serialize( writer, childFi.GetValue( root ), name, false );
} }
} }
} }
@ -580,7 +627,9 @@ public class XmlFormatter2 : IFormatter
Type typeElem = arr.GetType().GetElementType(); Type typeElem = arr.GetType().GetElementType();
writer.WriteAttributeString( "t", getTypeName( typeElem ) ); Type type = root.GetType();
writer.WriteAttributeString( "t", getTypeName( type ) );
bool first; bool first;
@ -595,7 +644,7 @@ public class XmlFormatter2 : IFormatter
for( int i = 0; i < arr.Length; ++i ) for( int i = 0; i < arr.Length; ++i )
{ {
Serialize( writer, arr.GetValue( i ), "i" + i.ToString() ); Serialize( writer, arr.GetValue( i ), "i" + i.ToString(), false );
} }
} }
} }