具有不同 XML 字段的 DataContract Name 属性

问题描述 投票:0回答:1

我正在调用通用端点

/api/foo
,它返回描述
foo
的 XML。您可以将任何实体名称作为
foo
传递,它将返回其数据。

以下是一些回复示例。 打电话时

api/foo1

<foo1>
    <name>SomeValue</name>
    <id>101</id>
</foo1>

打电话时

api/foo2
:

<foo2>
    <name>SomeOtherValue</name>
    <id>205</id>
</foo2>

基本上,XML 将使用路径中请求的

foo
参数打开。 (name, id) 内的字段是固定的。
foo
实体名称可以由用户定义,因此没有我可以使用的固定已知先验列表。

我正在尝试使用这个

DataContractSerializer
和这个
DataContract
:

反序列化 XML
[DataContract(Name = "foo1", Namespace = "")]
public class Foo
{
    [DataMember(Name = "name")] 
    public string Name { get; set; }
    
    [DataMember(Name = "id")] 
    public string Id { get; set; }
}

当然,这对于

foo1
来说效果很好,但对于任何其他实体名称不起作用。

是否可以在运行时以某种方式参数化

DataContract
Name
?我正在自己构建序列化器。

此处是最小的可重现示例。第一个断言工作正常,第二个断言失败。


[DataContract(Name = "foo1", Namespace = "")]
public class Foo
{
    [DataMember(Name = "name")] 
    public string Name { get; set; }
    
    [DataMember(Name = "id")] 
    public string Id { get; set; }
}

[Fact]
public void TestDeserialization()
{
     var foo1 = "<foo1>\n\t<name>SomeValue</name>\n\t<id>101</id>\n</foo1>";
     var foo2 = "<foo2>\n\t<name>SomeOtherValue</name>\n\t<id>205</id>\n</foo2>";
        
     var serializer = new DataContractSerializer(typeof(Foo));
     var objFoo1 = (Foo)serializer.ReadObject(XmlReader.Create(new StringReader(foo1)));
     var objFoo2 = (Foo)serializer.ReadObject(XmlReader.Create(new StringReader(foo2)));

     bjFoo1.Name.Should().Be("SomeValue");
     bjFoo2.Name.Should().Be("SomeOtherValue");
}
c# .net xml datacontractserializer datacontract
1个回答
0
投票

如果您定义了端点,为什么不更改它,以便它始终返回

<foo>
并添加第三个名为
<type>
的参数。 所以 foo1 看起来像这样:

<foo>
   <type>foo1</type>
   <name>SomeValue</name>
   <id>101</id>
</foo>

对于 foo2 来说是这样的:

<foo>
   <type>foo2</type>
   <name>SomeValue</name>
   <id>101</id>
</foo>

在您的数据类中,您只需将其更改为:

[DataContract(Name = "foo", Namespace = "")]
public class Foo
{
    [DataMember(Name = "type")] 
    public string Type{ get; set; }

    [DataMember(Name = "name")] 
    public string Name { get; set; }
    
    [DataMember(Name = "id")] 
    public string Id { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.