我无法理解我的对象之一的序列化。
场景:
我正在从给定格式的服务接收数据。我想按原样接收数据。由于命名约定,我必须使用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。
我是否必须将此对象包装到另一个对象中才能实现? 感谢您的提示! 蓝光
答案 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);
...所以我很欣赏这种感觉不理想。