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