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

时间:2014-01-13 15:52:49

标签: c# linq linq-to-sql json.net

我正在尝试了解所包含的代码段行为,但它并不像我期望的那样工作。这就是我正在做的事情:

  1. 将LINQ对象序列化为JSON
  2. 将(1)的JSON反序列化为其初始类型
  3. 验证每个属性是否仍在Object
  4. 我将对象从(2)序列化回JSON
  5. 从(4)打印json并目视检查
  6. 我的问题是在(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);
    

    到达“信息序列化”步骤(下一个代码剪切)时,我看到以下内容:

    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);
          }
      }
      
    5. 更新 这使我相信我可能需要找到一种方法来修改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);
      

2 个答案:

答案 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)

检查警报类(构造函数

# write the header
header = '46, 1001\nlastname, firstname\n,...'
with open('test.csv', 'w') as fp
    fp.write(header)

# write the rest
df.to_csv('test.csv', header=True, mode='a')

看起来您缺少 List init enter image description here

即使使用 EntitySet enter image description here