gpt4 book ai didi

c# - 更改 DataMember 的 XML 命名空间

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:56 24 4
gpt4 key购买 nike

我有两个 DataContract,我正在使用 DataContractSerializer 将其序列化为 XML。

我为两个不同的 DataContract 指定了不同的命名空间,但是,每个 DataContract 中都有一个 DataMember,它是相同的 POD 类型.此 POD 位于不同的 c# 命名空间中。

我想知道是否有一种方法可以根据它属于哪个包含类型来指定用于此 DataMember 的命名空间。

例如:

namespace NamespaceShared
{
using System.Runtime.Serialization;

[DataContract]
public sealed class SharedType
{
[DataMember(IsRequired = true)]
public int ValueOne { get; set; }

[DataMember(IsRequired = true)]
public int ValueTwo { get; set; }
}
}

namespace NamespaceOne
{
using System.Runtime.Serialization;
using NamespaceShared;

[DataContract(Namespace = "http://namespace.one")]
public sealed class DataContractOne
{
[DataMember(IsRequired = true)]
//[SomeNamespaceAttribute("http://namespace.one")]
private SharedType SharedValue { get; set; }
}
}

namespace NamespaceTwo
{
using System.Runtime.Serialization;
using NamespaceShared;

[DataContract(Namespace = "http://namespace.two")]
public sealed class DataContractTwo
{
[DataMember(IsRequired = true)]
//[SomeNamespaceAttribute("http://namespace.two")]
private SharedType SharedValue { get; set; }
}
}

我正在寻找可以在上面的代码中提供 SomeNamespaceAttribute 功能的东西。

注意:我不是在寻找有关如何更好地组织我的 DataContract 的建议,因为不幸的是我正在重构遗留代码并且无法更改 XML 格式。

最佳答案

DataContractSerializer 不会公开对 XML 生成的细粒度控制,因此这种属性本身不可用。但是,您可以将共享类子类化(假设您可以摆脱 sealed 访问修饰符),使用具有不同命名空间的两个不同的 DataContract 属性。

namespace NamespaceShared
{
using System.Runtime.Serialization;

public class SharedType
{
[DataMember(IsRequired = true)]
public int ValueOne { get; set; }

[DataMember(IsRequired = true)]
public int ValueTwo { get; set; }
}

[DataContract(Namespace = "http://namespace.one")]
public class SharedTypeOne : SharedType
{
}

[DataContract(Namespace = "http://namespace.two")]
public class SharedTypeTwo : SharedType
{
}
}

namespace NamespaceOne
{
using System.Runtime.Serialization;
using NamespaceShared;

[DataContract(Namespace = "http://namespace.one")]
public sealed class DataContractOne
{
[DataMember(IsRequired = true)]
private SharedTypeOne SharedValue { get; set; }
}
}

namespace NamespaceTwo
{
using System.Runtime.Serialization;
using NamespaceShared;

[DataContract(Namespace = "http://namespace.two")]
public sealed class DataContractTwo
{
[DataMember(IsRequired = true)]
private SharedTypeTwo SharedValue { get; set; }
}
}

如果一切都失败了,您可以使用类似于用于更改自动生成的前缀的技术来编辑来自服务的原始 XML。 This MSDN blog post详细介绍了整个过程。

关于c# - 更改 DataMember 的 XML 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17067180/

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