XamlServices.保存正在生成一个x:Name="__ReferenceID0"属性,而有R

本文关键字:quot Name ReferenceID0 而有 属性 保存 一个 XamlServices | 更新日期: 2023-09-27 18:15:15

我在使用XamlServices序列化/反序列化时遇到了麻烦。我有这样一个类:

[RuntimeNameProperty("Name")]
[ContentProperty("Children")]
public class Node
{
    public Node()
    {
    }
    public string   Name    { get; set; }
    public int      Valeur  { get; set; }
    public Node Parent
    {
        get;
        set;
    }
    public bool HasChildren
    {
        get { return mChildren.Count > 0; }
    }
    public NodeList Children
    {
        get { return mChildren; }
        set { mChildren = value; }
    }
    NodeList mChildren = new NodeList();
}

NodeList是一个短类,定义为:

public class NodeList : IList<Node>
{
    // ... implemented using a List<Node> internally
}

如果我创建一个节点层次结构,像这样:

Node root = new Node() { Name = "A", Valeur = 2, Parent = null };
root.Children.Add( new Node() { Name = "A1", Valeur = 3, Parent = root } );
root.Children.Add( new Node() { Name = "A2", Valeur = 3, Parent = root } );
root.Children[0].Children.Add( new Node() { Name = "A21", Valeur = 5, Parent = root.Children[0] } );

,我这样序列化它:

using( TextWriter writer = File.CreateText( "test.xaml" ) )
{
    XamlServices.Save( writer, root );
}

结果如下:

<Node Parent="{x:Null}" x:Name="__ReferenceID1" Name="A" Valeur="2"
   xmlns="clr-namespace:TestCRTP;assembly=TestCRTP"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Node Parent="{x:Reference A}" x:Name="__ReferenceID0" Name="A1" Valeur="3">
        <Node Parent="{x:Reference A1}" Name="A21" Valeur="5">
            <NodeList />
        </Node>
    </Node>
    <Node Parent="{x:Reference A}" Name="A2" Valeur="3">
        <NodeList />
    </Node>
</Node>

正如你所看到的,XamlServices正在生成"__ReferenceID0"属性,它不应该这样做,因为有RuntimeNameProperty属性…显然,它这样做是因为x:引用(由于Parent关系),但最有趣的是它甚至没有使用生成的x:Name!!当然,当我试图反序列化它时,情况会变得更糟:

using( TextReader reader = File.OpenText( "test.xaml" ) )
{
    Node node = XamlServices.Load( reader ) as Node;
}

我得到了错误" "名称"属性已经在'节点'上设置",这是合乎逻辑的,因为确实已经有一个名称....

有线索吗?

XamlServices.保存正在生成一个x:Name="__ReferenceID0"属性,而有R

只有两种解决方案,要么您必须将Name属性更改为其他东西,如XName或任何不是"Name"的东西。

或者你必须关闭父级序列化,

[DesignerSerializability(DesignerSerializability.Hidden)]
public Node Parent
{
    get;
    set;
}

但是在这种情况下,你必须在加载对象图之后手动处理节点并设置父节点。

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