我有一个带有Object类型属性的基类型(一段遗留代码,许多项目都使用这个基类型)。后来添加了基类型的泛型版本,将属性公开为泛型类型。
使用ServiceStack.Text序列化和反序列化泛型类型将设置基类(type object)上的属性,而不是派生类上更特定的类型。
重现错误的简单控制台应用程序如下所示:
class Program
{
public class Base<T> : Base
{
//hide the Value property on the base class
public new T Value { get; set; }
}
public class Base
{
public object Value { get; set; }
}
static void Main(string[] args)
{
var a = new Base<List<string>>()
{
Value = new List<string>() { "one", "two", "three" },
};
var serialized = TypeSerializer.SerializeToString(a);
var deserialized = TypeSerializer.DeserializeFromString<Base<List<string>>>(serialized);
//throws a null ref exception
Console.WriteLine(deserialized.Value.Count);
}
}
感谢任何帮助。
基于这个答案,我通过使基
和基
从一个新的抽象基类继承来解决这个问题,如下所示:
public abstract class DummyBase
{
public string Test { get; set; } = "Test";
}
public class BaseResponse<T> : DummyBase
{
public T Value { get; set; }
}
public class BaseResponse : DummyBase
{
public object Value { get; set; }
}
即使base.value是隐藏的,它仍然对反射可见(例如使用a.getType().getProperties()
。这可能是问题所在。
下面的似乎起作用了。base
中的getter和setter只是包装base.value
。dummybase
是获取ServiceStack以将字符串反序列化为正确类型所必需的。
class Program
{
public static void Main (string[] args)
{
var a = new Base<List<string>>()
{
Value = new List<string> { "one", "two", "three" },
};
var serialized = TypeSerializer.SerializeToString(a);
var deserialized = TypeSerializer.DeserializeFromString<DummyBase<List<string>>>(serialized);
// no longer throws a null ref exception
Console.WriteLine(deserialized.Value.Count);
}
}
public class DummyBase<T>
{
public T Value { get; set; }
}
public class Base<T> : Base
{
public new T Value
{
get { return (T)base.Value; }
set { base.Value = value; }
}
}
public class Base
{
public object Value { get; set; }
}
当然,如果base
不是从base
继承的,那么所有这些都是不必要的。
我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)
问题内容: 我正在尝试制作一个使用Jackson来反序列化POJO的类。 看起来像这样… 我对此实施有2个问题。 首先是我将类类型传递给方法,以便对象映射器知道应反序列化的类型。有使用泛型的更好方法吗? 同样在get方法中,我将一个从objectMapper返回的对象强制转换为T。这看起来特别讨厌,因为我必须在此处强制转换T,然后还必须从调用它的方法中强制转换对象类型。 我在该项目中使用了Robo
问题内容: 我有一个json字符串,应该将其反序列化为以下类 我该怎么做?这是通常的方式 但是我怎么提到T代表什么呢? 问题答案: 你需要为使用的每种通用类型创建一个对象,并将其用于反序列化。例如
我有一个json字符串,我应该将其反序列化为以下类 我怎么做?这是通常的方式 但我怎么说T代表什么呢?
我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。