public ConfigMessageSerializerClass CreateClassInfoFromType(Type type, SerializationDefaults serializationDefaults = null) { if (serializationDefaults == null) { serializationDefaults = new SerializationDefaults(); } MessageSerializedClassInfo messageSerializedClassInfo = new MessageSerializedClassInfo(type, null, serializationDefaults); ConfigMessageSerializerClass configMessageSerializerClass = new ConfigMessageSerializerClass(); ConfigClassInfo configClassInfo = new ConfigClassInfo(); configClassInfo.AssemblyName = messageSerializedClassInfo.ClassType.Assembly.FullName; configClassInfo.ClassFullName = messageSerializedClassInfo.ClassType.FullName; configClassInfo.MessageClassAttribute = messageSerializedClassInfo.MessageClassAttribute; configMessageSerializerClass.ClassInfo = configClassInfo; foreach (MessageSerializedPropertyInfo messageSerializedPropertyInfo in messageSerializedClassInfo.Properties) { ConfigPropertyInfo configPropertyInfo = new ConfigPropertyInfo(); configPropertyInfo.Name = messageSerializedPropertyInfo.PropertyInfo.Name; //configPropertyInfo._messagePropertyAttribute = messageSerializedPropertyInfo.MessagePropertyAttribute; configPropertyInfo.Attributes.Add(messageSerializedPropertyInfo.MessagePropertyAttribute); configClassInfo.Properties.Add(configPropertyInfo); } return(configMessageSerializerClass); }
// Do the same with ReadFromFile public static ConfigMessageSerializerClass ReadFromFile(string filename) { FileStream fileStream = new FileStream(filename, FileMode.Open); XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigMessageSerializerClass), GetAttributeOverrides(GetDefaultExtraTypes())); ConfigMessageSerializerClass configMessageSerializerClass = (ConfigMessageSerializerClass)xmlSerializer.Deserialize(fileStream); fileStream.Close(); return(configMessageSerializerClass); }
// These functions are for reading and writing from files public static void WriteToFile(ConfigMessageSerializerClass messageSerializedClassInfo) { // The ClassFullName will be something like SomeNamespace.SomethingElse.ClassName // We just want the ClassName part // LastIndexOf will return -1 if there is no . so by adding 1 we'll get the whole string string filename = GetDefaultFileName(messageSerializedClassInfo.ClassInfo.ClassFullName); WriteToFile(filename, messageSerializedClassInfo); }
protected static List <Type> GetExtraTypes(ConfigMessageSerializerClass configMessageSerializerClass) { var extraTypes = new HashSet <Type>(); extraTypes.Add(typeof(Attribute)); foreach (var property in configMessageSerializerClass.ClassInfo.Properties) { foreach (var attribute in property.Attributes) { if (!extraTypes.Contains(attribute.GetType())) { extraTypes.Add(attribute.GetType()); } } } return(extraTypes.ToList()); }
public static void WriteToFile(string filename, ConfigMessageSerializerClass configMessageSerializerClass) { TextWriter writer = new StreamWriter(filename); // The XmlSerializer won't work correctly if you have a List<Something> and there are types // that derive from Something, like SomethingElse in the list. So we go through and find // them from the attributes so the XmlSerializer is aware of them. // Here's some articles of note: // https://stackoverflow.com/questions/11886290/use-the-xmlinclude-or-soapinclude-attribute-to-specify-types-that-are-not-known // https://stackoverflow.com/questions/4616505/is-there-a-reason-why-a-base-class-decorated-with-xmlinclude-would-still-throw-a // https://stackoverflow.com/questions/2689566/how-to-add-xmlinclude-attribute-dynamically/2689660#2689660 // https://en.it1352.com/article/4ff854d603034ef3a6364c581b252959.html XmlAttributeOverrides attributeOverrides = GetAttributeOverrides(configMessageSerializerClass); XmlSerializer xmlSerializer = new XmlSerializer(typeof(ConfigMessageSerializerClass), attributeOverrides); xmlSerializer.Serialize(writer, configMessageSerializerClass); writer.Close(); }
public static void WriteDefaultToFile(string filename, Type type) { ConfigMessageSerializerClass configMessageSerializerClass = Serializer.Instance.CreateClassInfoFromType(type); WriteToFile(filename, configMessageSerializerClass); }
public static XmlAttributeOverrides GetAttributeOverrides(ConfigMessageSerializerClass configMessageSerializerClass) { var extraTypes = GetExtraTypes(configMessageSerializerClass); return(GetAttributeOverrides(extraTypes)); }