反序列化大量 XML 文档时忽略空引用
Ignoring null references when de-serializing a massive XML document
我从我的 WCF 服务中获得了 XML 的大量负载,我需要将其写入 SQL 数据库。我使用的是最新版本的 .NET 和 Entity Framework 6.
"Okay, that's great," 你可能会说,"but what's the question?"
好吧,XML 正在被反序列化为 C# 对象(从特殊粘贴生成)并且它们工作得很好。但是,只要来自服务的有效负载不包含某些字段,当我将 XML 对象写入 EF 对象(这是一个 class 方法)时,我会收到空引用异常:
public ICollection<object> GetObjects()
{
List<object> objs = new List<object>();
foreach (var i in XmlObject.SubObj.SubObj.SubObj)
{
objs.Add(new MyEfObject() {
Prop1 = XmlObject.SubObj.SubObj.SubObj.ObjProperty // If "ObjProperty" is null,
// I get a null reference exception
});
}
return objs;
}
所以,我有非常不优雅的代码要检查
if (!ReferenceEquals(XmlObject.SubObj.SubObj.SubObj.ObjProperty, null) {
// Do stuff
}
这通常没问题,但对象太大了,我想避免输入 150 多次(以及对象的所有对象属性)。
必须有更优雅的方式,不是吗?
您可以简单地使用 ==
但 IMO 不优雅的部分不是检查 null
(这可以避免使用空对象模式)但事实上您正在访问 XmlObject.SubObj.SubObj.SubObj.ObjProperty
,我觉得你的类真的太耦合了
就是说,如果您不能更改它,那么您可以使用 LINQ 使您的代码更具可读性:
public ICollection<MyEfObject> GetObjects() {
return XmlObject.SubObj.SubObj.SubObj
.Where(x => x.property != null)
.Select(x => new MyEfObject { Prop1 = x.property })
.ToList();
}
我从我的 WCF 服务中获得了 XML 的大量负载,我需要将其写入 SQL 数据库。我使用的是最新版本的 .NET 和 Entity Framework 6.
"Okay, that's great," 你可能会说,"but what's the question?"
好吧,XML 正在被反序列化为 C# 对象(从特殊粘贴生成)并且它们工作得很好。但是,只要来自服务的有效负载不包含某些字段,当我将 XML 对象写入 EF 对象(这是一个 class 方法)时,我会收到空引用异常:
public ICollection<object> GetObjects()
{
List<object> objs = new List<object>();
foreach (var i in XmlObject.SubObj.SubObj.SubObj)
{
objs.Add(new MyEfObject() {
Prop1 = XmlObject.SubObj.SubObj.SubObj.ObjProperty // If "ObjProperty" is null,
// I get a null reference exception
});
}
return objs;
}
所以,我有非常不优雅的代码要检查
if (!ReferenceEquals(XmlObject.SubObj.SubObj.SubObj.ObjProperty, null) {
// Do stuff
}
这通常没问题,但对象太大了,我想避免输入 150 多次(以及对象的所有对象属性)。
必须有更优雅的方式,不是吗?
您可以简单地使用 ==
但 IMO 不优雅的部分不是检查 null
(这可以避免使用空对象模式)但事实上您正在访问 XmlObject.SubObj.SubObj.SubObj.ObjProperty
,我觉得你的类真的太耦合了
就是说,如果您不能更改它,那么您可以使用 LINQ 使您的代码更具可读性:
public ICollection<MyEfObject> GetObjects() {
return XmlObject.SubObj.SubObj.SubObj
.Where(x => x.property != null)
.Select(x => new MyEfObject { Prop1 = x.property })
.ToList();
}