C# Save正在生成一个x:Name="__参考0“;属性,同时存在RuntimeNameProperty

C# Save正在生成一个x:Name="__参考0“;属性,同时存在RuntimeNameProperty,c#,xaml,.net-4.0,C#,Xaml,.net 4.0,我在XamlServices序列化/反序列化方面遇到问题。 我有这门课: [RuntimeNameProperty(“名称”)] [内容财产(“儿童”)] 公共类节点 { 公共节点() { } 公共字符串名称{get;set;} public int Valeur{get;set;} 公共节点父节点 { 得到; 设置 } 公立学校有孩子 { 获取{return mChildren.Count>0;} } 公共节点主义儿童 { 获取{return mChildren;} 设置{mChildren=

我在XamlServices序列化/反序列化方面遇到问题。 我有这门课:

[RuntimeNameProperty(“名称”)]
[内容财产(“儿童”)]
公共类节点
{
公共节点()
{
}
公共字符串名称{get;set;}
public int Valeur{get;set;}
公共节点父节点
{
得到;
设置
}
公立学校有孩子
{
获取{return mChildren.Count>0;}
}
公共节点主义儿童
{
获取{return mChildren;}
设置{mChildren=value;}
}
NodeList mChildren=新的NodeList();
}
NodeList是一个短类,定义如下:

公共类节点列表:IList
{
//…在内部使用列表实现
}
如果创建节点层次结构,如下所示:

Node root=new Node(){Name=“A”,Valeur=2,Parent=null};
Add(新节点(){Name=“A1”,Valeur=3,Parent=root});
添加(新节点(){Name=“A2”,Valeur=3,Parent=root});
root.Children[0].Children.Add(新节点(){Name=“A21”,Valeur=5,Parent=root.Children[0]});
我以这种方式序列化它:

使用(TextWriter=File.CreateText(“test.xaml”))
{
Save(writer,root);
}
下面是生成的xaml:


如您所见,XamlServices正在生成“\uuuReferenceId0”属性,但它不应该这样做,因为存在RuntimeNameProperty属性。。。显然,它这样做是因为x:Reference(由于父关系),但最有趣的是它甚至没有使用生成的x:Name!!当然,当我尝试反序列化它时,情况会变得更糟:

使用(TextReader=File.OpenText(“test.xaml”))
{
Node Node=XamlServices.Load(reader)as Node;
}
我得到一个错误“Node”上已经设置了“Name”属性,这是合乎逻辑的,因为实际上已经有一个名称了


有什么线索吗?

只有两种解决方案,要么您必须将Name属性更改为XName之类的其他属性,要么更改为任何不是“Name”的属性

或者您必须关闭父序列化

[DesignerSerializability(DesignerSerializability.Hidden)]
public Node Parent
{
    get;
    set;
}
但在这种情况下,在加载对象图后,您必须处理节点并手动设置父节点


XAML这样做的原因是序列化相互连接的对象图,而不仅仅是一棵树。它使用名称来唯一标识节点,但是当它试图解析引用名称时,它的内部逻辑现在允许您使用属性名称。

只有两种解决方案,要么您必须将名称属性更改为其他名称,如XName,要么更改为任何非“名称”的内容

或者您必须关闭父序列化

[DesignerSerializability(DesignerSerializability.Hidden)]
public Node Parent
{
    get;
    set;
}
但在这种情况下,在加载对象图后,您必须处理节点并手动设置父节点


XAML这样做的原因是序列化相互连接的对象图,而不仅仅是一棵树。它使用名称来唯一标识节点,但是当它试图解析引用名称时,它的内部逻辑现在允许您使用属性名称。

我曾想过关闭父序列化,但我认为我错过了一些东西,还有另一个解决方案……哎呀,我太快按了“回车”键!所以,这里是我的全部答案:我想关闭父序列化,但我认为我错过了一些东西,还有另一个解决方案。。。这对我来说听起来有点老套:)我确信使用RuntimeNameProperty可以让我向XAML指出给定的属性是唯一标识节点的属性。无论如何,我也尝试将该属性命名为其他属性,但也没有用。我想我必须关闭“父”属性序列化。谢谢我想关闭父序列化,但我想我错过了一些东西,还有另一个解决方案……哎呀,我太快按了“回车”键!所以,这里是我的全部答案:我想关闭父序列化,但我认为我错过了一些东西,还有另一个解决方案。。。这对我来说听起来有点老套:)我确信使用RuntimeNameProperty可以让我向XAML指出给定的属性是唯一标识节点的属性。无论如何,我也尝试将该属性命名为其他属性,但也没有用。我想我必须关闭“父”属性序列化。谢谢