在反序列化期间使用DataMember,但在序列化期间使用螺母吗?

时间:2018-09-11 08:22:50

标签: c# json serialization

我无法理解我的对象之一的序列化。

场景:

我正在从给定格式的服务接收数据。我想按原样接收数据。由于命名约定,我必须使用DataMember属性将传入的数据与正确命名的类属性进行匹配。我为此使用System.Runtime.Serialization。示例:

[DataContract]
public class IncomingData
{
    [DataMember(Name = "$Filename")]
    public string Filename { get; set; }
}

这可以正常工作,并且数据映射到内部属性名称。 在某些时候,我必须再次序列化该对象,并且天真地认为它会序列化为内部属性名称,例如

{ "Filename":"C:\temp\lala.txt"} 

但是,这不是真的,而是使用原始属性名“ $ Filename”。我认为这是因为DataMember可以双向工作。

是否有一种优雅的方法来将此对象序列化为属性名称并忽略DataMember?我尝试使用其他序列化库(JSON.NET)是否有效,但它似乎也遵循DataMember。

我是否必须将此对象包装到另一个对象中才能实现? 感谢您的提示! 蓝光

1 个答案:

答案 0 :(得分:1)

您可以定义一个接口以使这些对象保持同步...

public interface IData
{
    string Filename { get; set; }
}

// deserialize me.
[DataContract]
public class IncomingData : IData
{
    [DataMember(Name = "$Filename")]
    public string Filename { get; set; }
}

// serialize me.
public class Data : IData
{
    public string Filename { get; set; }
}

...或者您可以使用虚拟属性并使用序列化属性覆盖它们...

// serialize me.
class Data
{
    public virtual string Filename { get; set; }
}

// deserialize me.
[DataContract]
class IncomingData : Data
{
    [DataMember(Name = "$Filename")]
    public override string Filename { get => base.Filename; set => base.Filename = value; }
}

...这两种方法都需要使用诸如AutoMapper的映射器,将IncomingData克隆到无属性的Data类中。

mapper.Map<IncomingData, Data>(user);

...所以我很欣赏这种感觉不理想。