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

gui*_*mie 6 c# linq json.net linq-to-sql

我试图理解包含的代码片段行为,它不能像我期望的那样工作.这是我正在做的事情:

  1. 将LINQ对象序列化为JSON
  2. 在(1)中将JSON反序列化为其初始类型
  3. 验证每个属性是否仍在Object中
  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
Run Code Online (Sandbox Code Playgroud)

更新:

我做了一些debbugging,并在序列化deserializedObject

var json2 = JsonConvert.SerializeObject(deserializedObject);
Run Code Online (Sandbox Code Playgroud)

到达Info Serialization步骤时我看到以下内容(下一个代码被剪切):

  1. this.serializing是真的
  2. this._Infos.HasLoadedOrAssignedValues为false
  3. 调用get return null.(get返回null值)
  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);
        }
    }
    
    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)

Jac*_*cob 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; }
}
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”}]}