调整对象图的XAML序列化

时间:2011-12-21 11:45:28

标签: .net xaml serialization

我的应用程序使用内置的.NET解决方案从内存中的对象生成XAML文件:System.XamlServices.Save(Stream, Object) 但是,我得到的XAML严重受到污染。所有属性始终是序列化的。 有没有办法告诉XAML序列化程序忽略保存默认值的属性?(我几乎可以完全控制序列化的类。)

Expression Blend解决了这个问题:如果我们不更改属性,生成的XAML文件将根本不包含它。生成的XAML并没有包含所有可能的属性及其默认值,并且看起来不像常规自动生成的混乱。我也想拥有漂亮的XAML。

2 个答案:

答案 0 :(得分:3)

旧问题,但我最近也遇到了这个问题,看起来Xaml序列化程序尊重DefaultValueAttribute

我实际上没有在.net 4.5的任何版本中测试过这个,但我记得在2006年的一篇文章中读到这篇文章(我现在不能发现它不幸)

要生成更清晰的xaml的其他两个属性是ContentAttribute 当其他元素被指定为该元素的直接子元素时允许特定属性为“默认”,并允许您指定用于包装这些值的集合的ContentWrapperAttribute(对于集合)

答案 1 :(得分:1)

仅使用一个对象执行此操作:

在:

  • 使用默认属性
  • 创建一个新对象
  • 将其序列化为XAML
  • 将其加载到XML DOM
  • 通过每个子节点和子子节点递归
  • 将每个字符串保存到字典中,其中键为节点的XPath,值为innerXML。显然,如果你有相同路径的节点,这将无法工作,你将不得不限定它们。但在这种情况下,你可能想要永远不要修剪它们。
  • 您不再需要该对象了。推动它,保持字典。

对于每个对象:

  • 将该对象序列化为XAML
  • 加载到XML DOM
  • 通过每个子节点和子子节点递归
  • 在字典中查找每个XPath。
  • 如果innerXML是相同的,请在应该害怕的节点列表中注意这一点。
  • 完成递归后,向这些节点显示他们害怕的原因 - 删除它们!
  • DOM中应该有漂亮的XAML。

我让你在字典中使用相同的XPath来使嵌套对象更好地工作。然而,这取决于你的对象是什么以及它们如何嵌套以便能够与之对话。祝你好运!