代码之家  ›  专栏  ›  技术社区  ›  Ted

serviceStack.ormLite:serviceStack.text.assemblyUtils.totypeString(类型类型类型)中的NullReferenceException

  •  1
  • Ted  · 技术社区  · 6 年前

    当我继续测试ormlite时,我遇到了另一个问题,这个问题似乎发生在servicestack.text.assemblyutils:中。

    system.nullreferenceexception:object reference not set to an instance of an object.
    在ServiceStack.Text.AssemblyUtils.ToTypeString(类型类型)
    位于serviceStack.text.common.jsWriter`1.WriteType(textWriter编写器,对象值)
    at serviceStack.text.common.writeListsOfElements`2.<>c_uuDisplayClass1_0.<.cctor>b_uuu 0(文本编写器,对象obj)
    at serviceStack.text.common.writeListsOfElements`2.writeGenericList(textWriter writer,ilist`1列表)
    位于ServiceStack.Text.TypeSerializer.SerializeToString(对象值,类型类型类型)
    在serviceStack.text.typeserializer.serializeToString[t](t值)
    at serviceStack.ormLite.ormLiteDialogProviderBase`1.GetFieldValue(FieldDefinition FieldDef,对象值)
    在serviceStack.ormLite.ormLiteDialogProviderBase`1.GetValueOrDBNull[T](FieldDefinition FieldDef,Object Obj)
    在serviceStack.ormLite.ormLiteDialogProviderBase`1.setParameterValue[T](FieldDefinition FieldDef,IDataParameter P,Object Obj)
    at servicestack.ormlite.ormliteDialogProviderBase`1.setParameterValues[t](idbcommand dbcmd,object obj)
    在serviceStack.ormLite.ormLiteWriteCommandExtensions.insert[t](idbcommand dbcmd,t obj,action`1 commandfilter,boolean selectIdentity)
    在servicestack.ormlite.untypedapi`1.<>c_uu displayClass16_0.<insert>b_uuu 0(idbcommand dbcmd)
    at serviceStack.ormLite.ormLiteExecFilter.exec[t](idbConnection dbconn,func`2筛选器)
    在d:\[git]\core\coreservercommons\handlers\dbhandlers\ormlite\ormlitedbhandler.cs:line 253中的works.core.coreservercommons.handler.<>c ouu displayClass46_0.<addcoreObjectToDatabase>b ouu 0(idbConnection db)
    < /代码> 
    
    

    当我使用非类型化的API插入一个对象时,就会发生这种情况,如下所示:

    long insertedo=dbcluster.getdbandrun((idbConnection db)=>
    {
    coreObject.id=id;
    var typedapi=db.createTypedapi(coreObject.getType());
    返回typedapi.insert(coreObject,selectIdentity:true);
    (});
    < /代码> 
    
    

    我要插入的“coreObject:”

    公共类模块控制器:actor { 公共模块控制器(字符串用户名,列表<类型>联系人类型) { this.username=用户名; this.contactTypes=联系人类型; this.\u allowedLoginchannels=新建列表<类型>(); this._allowedloginchannels.add(typeof(coreclient)); } 公共列表<类型>联系人类型获取;设置; } < /代码>

    我设法找出nullRef的来源:

    基本上,如果在contacttypeslist中有一个nullentry,那么它会像上面那样失败。

    现在,在这种情况下,列表不应该包含nullvalue,但是如果因为它,我没有在ServiceStack内部获得nullRef深度,从而阻碍了我持久化对象,我会感觉好多了。也许我想要一个nullthere? 它只是在列表中,还是字典不能有null的值?当持久化时,还有什么不能是null

    ServiceStack是否应将其作为空值处理,因此在其JSON格式中,这很简单就是null?

    当我使用非类型化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的来源:

    enter image description here

    基本上,如果NULL进入ContactTypes列出,然后失败,如上所述。

    现在,在这种情况下,列表不应该包含无效的值,但是如果因为这个原因没有在ServiceStack内部获得nullRef深度,从而阻碍了我持久化对象,我会感觉好多了。也许我想要一个无效的那里? 它只是在列表中,还是字典中不能有无效的值吗?还有什么不能无效的坚持的时候?

    ServiceStack不应该将其作为空值处理,所以在其JSON格式中,这很简单null?

    1 回复  |  直到 6 年前
        1
  •  1
  •   mythz    6 年前

    null

    change the text serializer used to serialize complex types

    PostgreSqlDialect.Provider.StringSerializer = new JsonStringSerializer();