public void Read(IValueProvider value, XElement serialized) { var name = serialized.Name.LocalName; var type = FindDerivedType(value.Type, name); var instance = Activator.CreateInstance(type); var discoveryStrategy = ValueDiscoveryStrategy.Get(type) ?? valueDiscovery; var values = discoveryStrategy.GetValues(instance); foreach (var property in values) { var attribute = serialized.Attribute(property.Name); if (attribute != null) { MEFHost.Instance.SerializationService.Read(property, attribute.Value); continue; } var subElement = serialized.Element(property.Name); if (subElement != null) { MEFHost.Instance.SerializationService.Read(property, subElement); continue; } } value.SetValue(instance); }
public object Write(IValueProvider value) { var instance = value.GetValue <object>(); var result = new XElement(value.Name); var discoveryStrategy = ValueDiscoveryStrategy.Get(instance.GetType()) ?? valueDiscovery; var values = discoveryStrategy.GetValues(instance); foreach (var property in values) { var serialized = MEFHost.Instance.SerializationService.Write(property); if (serialized is string) { var attribute = new XAttribute(property.Name, serialized.ToString()); result.Add(attribute); } else if (serialized is XElement) { result.Add(new XElement(property.Name, serialized)); } } return(result); }