ServiceStack.OrmLite: ServiceStack.Text.AssemblyUtils.ToTypeString 中的 NullReferenceException(类型类型)
ServiceStack.OrmLite: NullReferenceException in ServiceStack.Text.AssemblyUtils.ToTypeString(Type type)
当我继续测试 OrmLite 时,我 运行 遇到了另一个问题,这个问题似乎发生在 ServiceStack.Text.AssemblyUtils:
System.NullReferenceException: Object reference not set to an instance of an object.
at ServiceStack.Text.AssemblyUtils.ToTypeString(Type type)
at ServiceStack.Text.Common.JsWriter`1.WriteType(TextWriter writer, Object value)
at ServiceStack.Text.Common.WriteListsOfElements`2.<>c__DisplayClass1_0.<.cctor>b__0(TextWriter writer, Object obj)
at ServiceStack.Text.Common.WriteListsOfElements`2.WriteGenericIList(TextWriter writer, IList`1 list)
at ServiceStack.Text.TypeSerializer.SerializeToString(Object value, Type type)
at ServiceStack.Text.TypeSerializer.SerializeToString[T](T value)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.GetFieldValue(FieldDefinition fieldDef, Object value)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.GetValueOrDbNull[T](FieldDefinition fieldDef, Object obj)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.SetParameterValue[T](FieldDefinition fieldDef, IDataParameter p, Object obj)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.SetParameterValues[T](IDbCommand dbCmd, Object obj)
at ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.Insert[T](IDbCommand dbCmd, T obj, Action`1 commandFilter, Boolean selectIdentity)
at ServiceStack.OrmLite.UntypedApi`1.<>c__DisplayClass16_0.<Insert>b__0(IDbCommand dbCmd)
at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
at tWorks.Core.CoreServerCommons.Handlers.OrmLiteDbHandler.<>c__DisplayClass46_0.<AddCoreObjectToDatabase>b__0(IDbConnection db) in D:\[GIT]\Core\CoreServerCommons\Handlers\DbHandlers\OrmLite\OrmLiteDbHandler.cs:line 253
当我使用 Untyped API 插入对象时会发生这种情况,如下所示:
long insertedId = dbCluster.GetDbAndRun((IDbConnection db) =>
{
coreObject.Id = id;
var typedApi = db.CreateTypedApi(coreObject.GetType());
return typedApi.Insert(coreObject, selectIdentity: true);
});
我要插入的'coreObject':
public class ModuleController : Actor
{
public ModuleController(string username, List<Type> contactTypes)
{
this.Username = username;
this.ContactTypes = contactTypes;
this._AllowedLoginChannels = new List<Type>();
this._AllowedLoginChannels.Add(typeof(CoreClient));
}
public List<Type> ContactTypes { get; set; }
}
我设法找出 NullRef 的来源:
基本上,如果 ContactTypes
列表中有一个 NULL
条目,那么它会像上面那样失败。
现在,在这种情况下,列表不应包含 NULL
值,但如果我没有因为它而在 ServiceStack 深处获得 NullRef,我会感觉好多了,这阻碍了我持久化对象。也许我想要 NULL
那里?
它只是在列表中,还是字典也不能有 NULL
值?坚持的时候还有什么不能NULL
?
ServiceStack 不应该把它当作 null 来处理,所以在它的 JSON 格式中,这很简单 null
?
OrmLite 默认使用 JSV 格式序列化复杂类型的 blob,它是白色 space 敏感的,使用 CSV 格式,不包含 null
数据类型,因为会被推断作为“null”字符串,相反,任何空属性都被简单地从有线格式中排除,这与在反序列化时保留默认 属性 值具有相同的效果。
如果您想在序列化数据中包含空值,您可以change the text serializer used to serialize complex types,例如:
PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer();
当我继续测试 OrmLite 时,我 运行 遇到了另一个问题,这个问题似乎发生在 ServiceStack.Text.AssemblyUtils:
System.NullReferenceException: Object reference not set to an instance of an object.
at ServiceStack.Text.AssemblyUtils.ToTypeString(Type type)
at ServiceStack.Text.Common.JsWriter`1.WriteType(TextWriter writer, Object value)
at ServiceStack.Text.Common.WriteListsOfElements`2.<>c__DisplayClass1_0.<.cctor>b__0(TextWriter writer, Object obj)
at ServiceStack.Text.Common.WriteListsOfElements`2.WriteGenericIList(TextWriter writer, IList`1 list)
at ServiceStack.Text.TypeSerializer.SerializeToString(Object value, Type type)
at ServiceStack.Text.TypeSerializer.SerializeToString[T](T value)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.GetFieldValue(FieldDefinition fieldDef, Object value)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.GetValueOrDbNull[T](FieldDefinition fieldDef, Object obj)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.SetParameterValue[T](FieldDefinition fieldDef, IDataParameter p, Object obj)
at ServiceStack.OrmLite.OrmLiteDialectProviderBase`1.SetParameterValues[T](IDbCommand dbCmd, Object obj)
at ServiceStack.OrmLite.OrmLiteWriteCommandExtensions.Insert[T](IDbCommand dbCmd, T obj, Action`1 commandFilter, Boolean selectIdentity)
at ServiceStack.OrmLite.UntypedApi`1.<>c__DisplayClass16_0.<Insert>b__0(IDbCommand dbCmd)
at ServiceStack.OrmLite.OrmLiteExecFilter.Exec[T](IDbConnection dbConn, Func`2 filter)
at tWorks.Core.CoreServerCommons.Handlers.OrmLiteDbHandler.<>c__DisplayClass46_0.<AddCoreObjectToDatabase>b__0(IDbConnection db) in D:\[GIT]\Core\CoreServerCommons\Handlers\DbHandlers\OrmLite\OrmLiteDbHandler.cs:line 253
当我使用 Untyped API 插入对象时会发生这种情况,如下所示:
long insertedId = dbCluster.GetDbAndRun((IDbConnection db) =>
{
coreObject.Id = id;
var typedApi = db.CreateTypedApi(coreObject.GetType());
return typedApi.Insert(coreObject, selectIdentity: true);
});
我要插入的'coreObject':
public class ModuleController : Actor
{
public ModuleController(string username, List<Type> contactTypes)
{
this.Username = username;
this.ContactTypes = contactTypes;
this._AllowedLoginChannels = new List<Type>();
this._AllowedLoginChannels.Add(typeof(CoreClient));
}
public List<Type> ContactTypes { get; set; }
}
我设法找出 NullRef 的来源:
基本上,如果 ContactTypes
列表中有一个 NULL
条目,那么它会像上面那样失败。
现在,在这种情况下,列表不应包含 NULL
值,但如果我没有因为它而在 ServiceStack 深处获得 NullRef,我会感觉好多了,这阻碍了我持久化对象。也许我想要 NULL
那里?
它只是在列表中,还是字典也不能有 NULL
值?坚持的时候还有什么不能NULL
?
ServiceStack 不应该把它当作 null 来处理,所以在它的 JSON 格式中,这很简单 null
?
OrmLite 默认使用 JSV 格式序列化复杂类型的 blob,它是白色 space 敏感的,使用 CSV 格式,不包含 null
数据类型,因为会被推断作为“null”字符串,相反,任何空属性都被简单地从有线格式中排除,这与在反序列化时保留默认 属性 值具有相同的效果。
如果您想在序列化数据中包含空值,您可以change the text serializer used to serialize complex types,例如:
PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer();