如何从 DataContract 类中的 KnownType 中删除类型属性?

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

是否可以使用 KnownType 的类名而不是父类作为标签?例如

这是较大 DataContract xml 文件的摘录,

[DataContract (Namespace = "projectNamespace")]
[KnownType(typeof(Warning)), KnownType(typeof(Error))]
public abstract class Message
{
    protected Message(LogLevel logLevel, int percentUsed, string message)
    {
        this.LogLevel = logLevel;
        this.LogMessage = message;
        this.Percent = percentUsed;
    }

    internal readonly LogLevel LogLevel;
    [DataMember] internal readonly int Percent;    
    [DataMember] internal readonly string LogMessage;
}

[DataContract (Name="Warning", Namespace = "projectNamespace")]
internal sealed class Warning : Message
{
    public Warning(int percentUsed, string message) : base(LogLevel.Warn, percentUsed, message)
    {
    }
}

[DataContract(Name = "Error", Namespace = "projectNamespace")]
internal sealed class Error : Message
{
    public Error(int percentUsed, string message) : base(LogLevel.Error, percentUsed, message)
    {
    }
}

public enum LogLevel
{
    Warn, Error
}

我所看到的:

<messages>
  <Message i:type="Warning">
    <PercentUsed>75</PercentUsed>
    <LogMessage>75% used</LogMessage>
  </Message>
  <Message i:type="Error">
    <PercentUsed>100</PercentUsed>
    <LogMessage>0% remaining</LogMessage>
  </Message>
</messages>

预期:

<messages>
  <Warning>
    <PercentUsed>75</PercentUsed>
    <LogMessage>75% used</LogMessage>
  </Warning>
  <Error>
    <PercentUsed>100</PercentUsed>
    <LogMessage>0% remaining</LogMessage>
  </Error>
</messages>

注意该消息如何具有令人讨厌的

i:type="Error"
而不仅仅是
<Error>

c# xml wcf datacontractserializer datacontract
1个回答
0
投票

您实施的方法很好。您已经实现了派生运行时类型的单个对象的多态性。

你认为你想要的东西是错误的。对你来说看似多余的东西绝对是必要且信息丰富的。在

<Message i:type="Warning">
中,标签
Message
表示抽象基类型。属性值
Warning
表示从
Message
派生的实例运行时类型。如果 XML 不包含基类的名称
Message
,则代码项目机制甚至不会搜索已知类型 的集合。代码应该如何“知道”在哪里寻找它们?

然而,通过缩短“明显”(不,根本不明显)来“改进”数据契约 XML 的尝试就是整个现象。为什么这里有“临时”方法?为什么你认为这种混乱可以改善任何事情?我无法理解你们。 您已经很好地完成了合同并产生了正确的结果,所以我建议您接受我的回答并关闭问题。

© www.soinside.com 2019 - 2024. All rights reserved.