gpt4 book ai didi

c# - Linq 对象属性在序列化后消失

转载 作者:太空狗 更新时间:2023-10-29 22:01:02 26 4
gpt4 key购买 nike

我试图了解包含的代码片段行为,但它并没有像我预期的那样工作。这是我正在做的:

  1. 将 LINQ 对象序列化为 JSON
  2. 将 (1) 处的 JSON 反序列化为初始类型
  3. 验证每个属性仍在对象中
  4. 我将 (2) 中的对象序列化回 JSON
  5. 打印 (4) 中的 json 并目视检查

我的问题是,在 (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

更新:

我做了一些debbugging,在deserializedObject的Serialization中

var json2 = JsonConvert.SerializeObject(deserializedObject);

我在到达信息序列化步骤时看到以下内容(下一个代码被截断):

  1. this.serializing 为真
  2. this._Infos.HasLoadedOrAssignedValues 为假
  3. get return null 被调用。 (get返回空值)
  4. 如果我放置一个断点,并将光标放在返回 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);
    }
    }

更新:这让我相信,当从 Newtons Json.Net 反序列化时,我可能需要找到一种方法来修改 HasLoadedOrAssignedValues 的默认值。

我还发现了一个脏修复,我不太喜欢它似乎有效:

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);

最佳答案

我正在尝试 Microsoft 的 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","Infos":[{"InfoId":"31e269a1-4354-423d-84bc-62f6dc06b10f"}]}

正确

正确

{"AlertId":"0340e855-065c-4ac7-868e-5999fa4b7862","Infos":[{"InfoId":"31e269a1-4354-423d-84bc-62f6dc06b10f"}]}

关于c# - Linq 对象属性在序列化后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21095551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com