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();