public static IDiscriminatorPolicy GetDiscriminatorPolicy(DiscriminatorType policyType) { switch (policyType) { case DiscriminatorType.Attribute: return new AttributeDiscriminatorPolicy(); break; case DiscriminatorType.Node: return new NodeDiscriminatorPolicy(); break; default: throw new Exception("Unable to determine the policy"); } }
public static object Deserialize(string xml, DiscriminatorType discriminatorType = DiscriminatorType.Attribute) { var xmlDocument = new XmlDocument(); xmlDocument.LoadXml(xml); // read "discriminator" and infer the real type var discriminatorPolicy = DiscriminatotyPolicyFactory.GetDiscriminatorPolicy(discriminatorType); // now we know the real type based on the discriminator to deserialize var serializer = new XmlSerializer(discriminatorPolicy.RetrieveRealType(xmlDocument)); using (var stream = new MemoryStream(Encoding.ASCII.GetBytes(xml))) { return serializer.Deserialize(stream); } }
public static string Serialize(object info, DiscriminatorType discriminatorType = DiscriminatorType.Attribute) { var serializer = new XmlSerializer(info.GetType()); using (var stream = new MemoryStream()) { // Serialize serializer.Serialize(stream, info); stream.Position = 0; // Open serialization output var xmlDocument = new XmlDocument(); xmlDocument.Load(stream); // Add a "discriminador" based on the real type, to use it during deserialization var discriminatorPolicy = DiscriminatotyPolicyFactory.GetDiscriminatorPolicy(discriminatorType); discriminatorPolicy.CreateDiscriminator(info, xmlDocument); // return the xml with the discriminator return xmlDocument.OuterXml; } }
// ctor is private so you can't create an invalid instance private RustyEnum(DiscriminatorType type, object value) { Discriminator = type; Value = value; }