ormlite-servicestack,servicestack-bsd,C#,.net,Dynamic,ormlite Servicestack,Servicestack Bsd" /> ormlite-servicestack,servicestack-bsd,C#,.net,Dynamic,ormlite Servicestack,Servicestack Bsd" />

C# 使用ServiceStack或MLite为动态类型创建键值表

C# 使用ServiceStack或MLite为动态类型创建键值表,c#,.net,dynamic,ormlite-servicestack,servicestack-bsd,C#,.net,Dynamic,ormlite Servicestack,Servicestack Bsd,我想在数据库中创建一个键值表 public class KeyValue { public string Id { get; set; } public dynamic Value {get; set; } } 使用稍微修改过的SqlProvider,我在获取CreateTable()以生成varchar(1024)Id,varchar(max)值方面没有问题 我没有问题保存对象到它。问题是当我加载对象时 var content = dbConn.GetById<Key

我想在数据库中创建一个键值表

public class KeyValue { 
    public string Id { get; set; }
    public dynamic Value {get; set; }
}
使用稍微修改过的SqlProvider,我在获取
CreateTable()
以生成
varchar(1024)Id
varchar(max)值方面没有问题

我没有问题保存对象到它。问题是当我加载对象时

var content = dbConn.GetById<KeyValue>("about");
除了返回字符串作为值之外,我无法获取任何其他内容。我可以告诉OrmLite序列化类型信息,以便能够正确地反序列化对象,还是只需手动执行

编辑:一些进一步的信息。OrmLite正在使用由
ServiceStack.Text.TypeSerializer
定义的Jsv序列化程序,在BSD版本中不可插入。如果我使用动态值将类型属性添加到KeyValue类中,我可以这样做

var value = content.Value as string;
MySpecificChildType strongType = 
                TypeSerializer.DeserializeFromString(content, content.Type);

我只是想要一个更好的方法,我真的不喜欢一个类型为1的对象进入数据库,然后用不同的类型(字符串)返回。

我没有用JsvSerializer做过很多工作,但是用JsonSerializer你可以做到这一点(用几种不同的方法)从ServiceStack 4.0.11开始,您可以选择使用JsonSerializer,请参阅

范例

public abstract class BaseClass {
    //Used for second example of custom type lookup
    public abstract string Type { get; set; }
}

public class ChildA : BaseClass {
    //Used for second example of custom type lookup
    public override string Type { get; set; }

    public string PropA { get; set; }
}
然后在init/bootstrap类中,您可以配置序列化程序以发出正确反序列化所需的类型信息:

public class Bootstrapper {
    public void Init() {
        ServiceStack.Text.JsConfig.ExcludeTypeInfo = false;
        ServiceStack.Text.JsConfig.IncludeTypeInfo = true;
    }
}
如果您希望使用ServiceStack使用的默认“\uuuu type”属性以外的内容(例如,如果您希望有一个友好的名称来标识类型,而不是名称空间/程序集),您还可以配置自己的自定义类型查找

public class Bootstrapper {
    public void Init() {
        ServiceStack.Text.JsConfig.ExcludeTypeInfo = false;
        ServiceStack.Text.JsConfig.IncludeTypeInfo = true;

        ServiceStack.Text.JsConfig.TypeAttr = "type";
        ServiceStack.Text.JsConfig.TypeFinder = type =>
        {
            if ("CustomTypeName".Equals(type, StringComparison.OrdinalIgnoreCase))
            {
                return typeof(ChildA);
            }

            return typeof(BaseClass);
        }
    }
}
public class Bootstrapper {
    public void Init() {
        ServiceStack.Text.JsConfig.ExcludeTypeInfo = false;
        ServiceStack.Text.JsConfig.IncludeTypeInfo = true;

        ServiceStack.Text.JsConfig.TypeAttr = "type";
        ServiceStack.Text.JsConfig.TypeFinder = type =>
        {
            if ("CustomTypeName".Equals(type, StringComparison.OrdinalIgnoreCase))
            {
                return typeof(ChildA);
            }

            return typeof(BaseClass);
        }
    }
}