【发布时间】:2019-07-19 13:17:38
【问题描述】:
我正在尝试序列化和反序列化的实体:
public class Car
{
public string Model { get; set; }
public DateTime Year { get; set; }
public List<string> Features { get; set; }
private Car _car;
public Car Car1
{
get
{
return _car != null ? _car : new Car();
}
set
{
_car = value;
}
}
}
我正在使用 Newtonsoft Json 库对上述实体进行序列化和反序列化。 在序列化和反序列化此实体时,我不能忽略任何属性。
虽然直接序列化实体会引发 StackOverflow 异常。
JsonConvert.SerializeObject(car)
它提到的大多数其他地方都提到了使用以下解决方案,但没有一个对我有用。
var _jsonSettings = new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.Auto,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ObjectCreationHandling = ObjectCreationHandling.Auto
};
var settings = new JsonSerializerSettings
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects
};
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
var serialize = JsonConvert.SerializeObject(car, _jsonSettings);
or
var serialize = JsonConvert.SerializeObject(car, settings);
我知道这个属性有问题
private Car _car;
public Car Car1
{
get
{
return _car != null ? _car : new Car();
}
set
{
_car = value;
}
}
但我现在无法摆脱它。
修改后的问题:
public interface IEntity
{
int Id { get; set; }
}
public class Base1 : IEntity
{
public virtual int Id { get; set; }
}
public class Car : Base1
{//same properties as defined above in above Car class + below property
private int _carId;
public int CarId
{
get { return _carId; }
set { _carId = value; Id = value; }
}
}
var car = new Car();
car.Model = "Amaze";
car.Year = new DateTime(2016, 1, 1);
car.Features = new List<string> { "Light", "1", "2" };
car.CarId = 1;
这里基类的 ID 总是为零,派生的总是设置非零值。 是否可以编写自定义转换器(通过检查属性 ID 的值是否为零,然后不要进一步序列化该属性(Car1 属性)?) 任何建议,如何实现这一目标?
【问题讨论】:
-
可能是错字,但在上面的代码中您使用的是 _jsonSettings,设置变量具有循环处理标志。我相信这就是你所追求的。换句话说,尝试更改为: var serialize = JsonConvert.SerializeObject(car, settings);
-
所以你的 Car 有一个 Car1,有一个 Car1,有一个 Car1,那个......你确定你的班级做你想让它做的事吗?
标签: c# serialization json.net deserialization