gui*_*mie 6 c# linq json.net linq-to-sql
我试图理解包含的代码片段行为,它不能像我期望的那样工作.这是我正在做的事情:
我的问题是在(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
Run Code Online (Sandbox Code Playgroud)
更新:
我做了一些debbugging,并在序列化deserializedObject
var json2 = JsonConvert.SerializeObject(deserializedObject);
Run Code Online (Sandbox Code Playgroud)
到达Info Serialization步骤时我看到以下内容(下一个代码被剪切):
如果我放一个断点,并把我的光标放在返回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);
}
}
Run Code Online (Sandbox Code Playgroud)更新: 这让我相信我可能需要找到一种方法来修改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);
Run Code Online (Sandbox Code Playgroud)
我正在尝试微软的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; }
}
Run Code Online (Sandbox Code Playgroud)
输出:
{“AlertId”:“0340e855-065c-4ac7-868e-5999fa4b7862”,“信息”:[{“InfoId”:“31e269a1-4354-423d-84bc-62f6dc06b10f”}]}
真的
真的
{“AlertId”:“0340e855-065c-4ac7-868e-5999fa4b7862”,“信息”:[{“InfoId”:“31e269a1-4354-423d-84bc-62f6dc06b10f”}]}
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |