当前位置: 首页 > 知识库问答 >
问题:

使用ServiceStack.Text反序列化派生泛型类型时出错

齐永昌
2023-03-14

我有一个带有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; }
}

共有1个答案

微生翼
2023-03-14

即使base.value是隐藏的,它仍然对反射可见(例如使用a.getType().getProperties()。这可能是问题所在。

下面的似乎起作用了。base 中的getter和setter只是包装base.valuedummybase 是获取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字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。