gpt4 book ai didi

c# - 使用 ASP.NET MVC Web API 时如何注册已知类型以进行序列化

转载 作者:太空狗 更新时间:2023-10-29 20:21:01 25 4
gpt4 key购买 nike

我有一个返回 public IEnumerable<IMessage> Get() 的 ASP.NET MVC Web API Controller

它抛出异常,我需要注册派生自 IMessage 的类型在传递给 DataContractSerializer 的已知类型集合中.

如何注册“已知类型”以用于 DataContractSerializerDataContractJSONSerializer在 MVC Web API 项目中?

KnownType 属性不能放在接口(interface)上。

最佳答案

您需要将 KnownTypeAttribute 放在您的 IMessage 实现中:

public interface  IMessage
{
string Content { get; }
}

[KnownType(typeof(Message))]
public class Message : IMessage {
public string Content{ get; set; }
}

[KnownType(typeof(Message2))]
public class Message2 : IMessage
{
public string Content { get; set; }
}

所以当调用下面的 Action 时:

 public IEnumerable<IMessage> Get()
{
return new IMessage[] { new Message { Content = "value1" },
new Message2 { Content = "value2" } };
}

结果是这样的:

<ArrayOfanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<anyType xmlns:d2p1="http://schemas.datacontract.org/2004/07/MvcApplication3.Controllers" i:type="d2p1:Message">
<d2p1:Content>value1</d2p1:Content>
</anyType>
<anyType xmlns:d2p1="http://schemas.datacontract.org/2004/07/MvcApplication3.Controllers" i:type="d2p1:Message2">
<d2p1:Content>value2</d2p1:Content>
</anyType>
</ArrayOfanyType>

但这只会以一种“方式”起作用。所以您不能回发相同的 XML。

为了执行以下操作:

public string Post(IEnumerable<IMessage> messages)

您需要在全局范围内注册已知类型,配置 DataContractSerializer 并在 GlobalConfiguration.Configuration.Formatters 中设置

GlobalConfiguration.Configuration
.Formatters
.XmlFormatter.SetSerializer<IEnumerable<IMessage>>(
new DataContractSerializer(typeof(IEnumerable<IMessage>),
new[] { typeof(Message), typeof(Message2) }));

通过使用配置,您不需要在实现类型上使用 KnownTypeAttribute

关于c# - 使用 ASP.NET MVC Web API 时如何注册已知类型以进行序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14522144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com