2015-06-19 3 views
3

В C# возможно ли сериализовать объект только с измененными значениями?Сериализовать только измененные свойства объекта

Например: У меня есть экземпляр объекта Button bind в PropertyGrid, и я хочу сериализовать этот объект Button только с измененными свойствами. В C#, какой был лучший подход к архивированию?

+0

_объект только с измененными свойствами_ - непонятно, чего вы ожидаете. можете ли вы добавить пример кода? –

+0

Как вы узнали, какие свойства * * изменены? – nvoigt

+0

Короткий ответ - нет, но посмотрите http://stackoverflow.com/questions/9377414/excluding-some-properties-during-serialization-without-changing-the-original-cla –

ответ

1

Вы можете перебирать свойства объекта посредством отражения, сравнивать его свойства со «свежим» экземпляром и записывать разницу как-то. Но вы должны решить многие проблемы, если вы выбираете этот путь, как null обработки, сериализации несериализуемых типов, сериализация ссылки и т.д. Вот только эскиз:

public static string ChangedPropertiesToXml<T>(T changedObj) 
    { 
     XmlDocument doc=new XmlDocument(); 
     XmlNode typeNode = doc.CreateNode(XmlNodeType.Element, typeof (T).Name, ""); 
     doc.AppendChild(typeNode); 
     T templateObj = Activator.CreateInstance<T>(); 
     foreach (PropertyInfo info in 
      typeof (T).GetProperties(BindingFlags.Instance | BindingFlags.Public)) 
     { 
      if (info.CanRead && info.CanWrite) 
      { 
       object templateValue = info.GetValue(templateObj, null); 
       object changedValue = info.GetValue(changedObj, null); 
       if (templateValue != null && changedValue != null && !templateValue.Equals(changedValue)) 
       { 
        XmlElement elem = doc.CreateElement(info.Name); 
        elem.InnerText = changedValue.ToString(); 
        typeNode.AppendChild(elem); 
       } 
      } 
     } 
     StringWriter sw=new StringWriter(); 
     doc.WriteContentTo(new XmlTextWriter(sw)); 
     return sw.ToString(); 
    } 

Вызов:

Button b = new Button(); 
b.Name = "ChangedName"; 
Console.WriteLine(SaveChangedProperties(b)); 

выход:

<Button> 
    <Name>ChangedName</Name> 
</Button> 
0

Из страницы, предоставленной вами.

Прежде всего вам нужно найти грязные свойства в объекте, вы можете иметь другой проект и дорожку, когда это происходит при изменении других свойств. или isdirty для каждого свойства, или если вы можете сравнить старый объект с новым объектом.

Затем в методе ToString() или пользовательском методе сериализации переопределите для генерации сериализованного объекта только с измененными свойствами.

Он работает для объекта POCO, для сложных объектов кнопок вы должны увидеть, как это сделать.

его просто и идея, больше, если есть образцы кода.

2

В ваших собственных типов: да, вы можете поддержать это - через ShouldSerialize* шаблон, например:

public string Name {get;set;} 
public bool ShouldSerializeName() { return Name != null; } 

Однако, на внешних типах - это полностью зависит от того, поддерживают ли они это. Обратите внимание, что это также укажет на свойство-сетку, которая будет завораживать.

В некоторых случаях также будет работать [DefaultValue({the default value})].

Смежные вопросы