c# - XML version-specific deserialization -
so, have base project , several modified version of it. baseproject contains class baseclass,
namespace baseproject.someclasses{ public abstract class baseclass{ //... } } while each of versions contain several inheritors of baseclass - f.e. projectone:
namespace baseproject.versionone.someclasses{ public class inheritorclass : baseclass{ //some logic here... } } and projecttwo:
namespace baseproject.versiontwo.someclasses{ public class inheritorclass : baseclass{ //some different logic here... } } the thing differs name of namespace.
base project loads each of assemblies during runtime , gets of inherited types. need create xml file, should contain both of inheritors' instances , pointers class instance should deserialized into:
... <baseclass xsi:type="inheritorclass"> <!-- versionone --> <propone></propone> <proptwo></proptwo> <propthree></propthree> <!-- ... --> </baseclass> <baseclass xsi:type="inheritorclass"> <!-- versiontwo --> <propfour></propfour> <propfive></propfive> <propsix></propsix> <!-- ... --> </baseclass> ... is there way deserialize xml (which contains instances of inheritors both of versions) ienumerable<baseclass>?
you need apply [xmltypeattribute(name)] attribute derived classes disambiguate xst:type names:
namespace baseproject.versionone.someclasses { [xmltype("versiononeinheritorclass")] public class inheritorclass : baseclass { public string versiononeproperty { get; set; } // instance } } and
namespace baseproject.versiontwo.someclasses { [xmltype("versiontwoinheritorclass")] public class inheritorclass : baseclass { public string versiontwoproperty { get; set; } // instance } } then xml appear follows, , can serialized , deserialized without loss of information:
<baseclass xsi:type="versiononeinheritorclass"> <versiononeproperty>one</versiononeproperty> </baseclass> <baseclass xsi:type="versiontwoinheritorclass"> <versiontwoproperty>two</versiontwoproperty> </baseclass>
by way, if constructing xmlserializer using xmlserializer (type, type[]) constructor add in discovered derived types, must cache serializer in static cache somewhere, or else have horrible resource leak.
Comments
Post a Comment