我有两个DataContract
我使用DataContractSerializer
序列化为XML。
我为两个不同的DataContract
指定了不同的命名空间,但每个DataMember
中有一个DataContract
,它具有相同的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格式无法更改。
答案 0 :(得分:1)
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详细说明了整个过程。