【发布时间】:2016-06-24 19:16:34
【问题描述】:
我遇到了一个奇怪的情况,IgnoreDataMember 没有做这项工作,但 JsonIgnore 做了。
在这种情况下,我从具有public {get; set;} 属性的类继承,并且我选择使用NotSupportedException 覆盖setter。我只希望序列化程序能够设置属性,而不是用户,但我希望用户得到它,所以我做了以下操作:
[DataContract]
public class BaseObject : BaseInterface
{
[DataMember]
public virtual double information { get; set; }
}
[DataContract]
public class ServerGeneratedObject : BaseObject
{
[IgnoreDataMember]
public override double information {
get { return server_set_information; }
set { throw new NotSupportedException("Server generated property"); }
}
[DataMember(Name="information")]
private double server_set_information { get; set; }
}
不幸的是,这会引发错误“'ServerGeneratedObject' 上已存在名为 'information' 的成员。使用 JsonPropertyAttribute 指定另一个名称。”
但是,如果我使用 [JsonIgnore] 属性,这将按预期工作。这似乎是由于数据合同解析器的这一部分 (code currently lives here):
bool flag2 = JsonTypeReflector.GetAttribute<JsonIgnoreAttribute>(attributeProvider) != null ||
JsonTypeReflector.GetAttribute<JsonExtensionDataAttribute>(attributeProvider) != null ||
JsonTypeReflector.GetAttribute<NonSerializedAttribute>(attributeProvider) != null;
if (memberSerialization != MemberSerialization.OptIn)
{
bool flag3 = JsonTypeReflector.GetAttribute<IgnoreDataMemberAttribute>(attributeProvider) != null;
property.Ignored = flag2 | flag3;
}
该属性未正确设置为“忽略”,因为它处于“选择加入”模式,但如果是这种情况,我不知道为什么继承的“信息”属性被“选择加入”,因为“DataMember” " 属性不应该是可继承的。我提交了一个错误here,以防这不是预期的行为。
有什么我可以在这里做的吗?我试图避免在我的公共数据模型上使用任何“Newtonsoft”属性,因为我不希望使用我的客户端库对象模型的人必须引用 Newtonsoft 程序集。
【问题讨论】:
-
我刚刚尝试使用
DataContractJsonSerializer序列化您的类,但它引发了异常数据协定类型“Question38020614.ServerGeneratedObject”不能使用 DataContractJsonSerializer 序列化,因为数据成员“信息”是在其类型层次结构中重复。
标签: c# serialization json.net .net-4.5