我正在尝试了解所包含的代码段行为,但它并不像我期望的那样工作。这就是我正在做的事情:
我的问题是在(5),任何LINQ实体都是主LINQ对象的属性,即使在(3)验证时它仍然存在。我所有的LINQ类都是LINQ to SQL。我正在使用Newtons JSON.Net库。我尝试使用非linq对象的相同类型的逻辑,并且不会发生在(5)处看到的缺陷。
var infoId = Guid.NewGuid();
var alertId = Guid.NewGuid();
var info = new Info();
info.InfoId = infoId;
var alert = new Alert();
alert.AlertId = alertId;
alert.Infos.Add(info);
var json = JsonConvert.SerializeObject(alert);
Debug.WriteLine(json); //All looking good, nothing missing
var deserializedObject = JsonConvert.DeserializeObject<Alert>(json);
Assert.AreEqual(alertId, deserializedObject.AlertId); //Assert is valid
Assert.AreEqual(infoId, deserializedObject.Infos[0].InfoId); //Assert is valid
var json2 = JsonConvert.SerializeObject(deserializedObject);
Debug.WriteLine(json2); //Infos is gone
更新
我做了一些调试,并在序列化deserializedObject
var json2 = JsonConvert.SerializeObject(deserializedObject);
到达“信息序列化”步骤(下一个代码剪切)时,我看到以下内容:
如果我放了一个断点,并将光标放在返回this._Infos上,我实际上看到它应该返回的对象......
[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Alert_Info", Storage="_Infos", ThisKey="AlertId", OtherKey="AlertId")]
[global::System.Runtime.Serialization.DataMemberAttribute(Order=15, EmitDefaultValue=false)]
public EntitySet<Info> Infos
{
get
{
if ((this.serializing && (this._Infos.HasLoadedOrAssignedValues == false)))
{
return null;
}
return this._Infos;
}
set
{
this._Infos.Assign(value);
}
}
更新 这使我相信我可能需要找到一种方法来修改HasLoadedOrAssignedValues的默认值,当它从Newtons Json.Net反序列化时。
我还发现了一个肮脏的修复程序,我真的不喜欢它似乎正在工作:
var deserializedObject = JsonConvert.DeserializeObject<EasAlert>(json);
var list = new List<EasInfo>();
deserializedObject.EasInfos.SetSource(list); //<--- Fix, the Info will show up in json2
Assert.AreEqual(alertId, deserializedObject.AlertId);
Assert.AreEqual(infoId, deserializedObject.EasInfos[0].InfoId);
答案 0 :(得分:0)
我正在尝试微软的JavaScriptSerializer,它运行良好。代码和输出可以在下面找到。
这可能是牛顿的错误吗?
void Main()
{
var infoId = Guid.NewGuid();
var alertId = Guid.NewGuid();
var info = new Info();
info.InfoId = infoId;
var alert = new Alert();
alert.AlertId = alertId;
alert.Infos.Add(info);
var jss = new JavaScriptSerializer();
var json = jss.Serialize(alert); //JsonConvert.SerializeObject(alert);
Debug.WriteLine(json); //All looking good, nothing missing
var deserializedObject = jss.Deserialize<Alert>(json); //JsonConvert.DeserializeObject<Alert>(json);
(alertId == deserializedObject.AlertId).Dump(); //Assert is valid
(infoId == deserializedObject.Infos[0].InfoId).Dump(); //Assert is valid
var json2 = jss.Serialize(deserializedObject); //JsonConvert.SerializeObject(deserializedObject);
Debug.WriteLine(json2); //Infos is gone - NOT GONE!
}
public class Alert
{
public Guid AlertId { get; set; }
public List<Info> Infos { get; set; }
public Alert()
{
Infos = new List<Info>();
}
}
public class Info
{
public Guid InfoId { get; set; }
}
<强>输出强>:
{ “AlertId”: “0340e855-065c-4ac7-868e-5999fa4b7862”, “相关信息”:[{ “INFOID”: “31e269a1-4354-423d-84bc-62f6dc06b10f”}]}
真
真
{ “AlertId”: “0340e855-065c-4ac7-868e-5999fa4b7862”, “相关信息”:[{ “INFOID”: “31e269a1-4354-423d-84bc-62f6dc06b10f”}]}
答案 1 :(得分:0)