使用 newtonsoft 自定义序列化器反序列化外部类属性

问题描述

因为下面的例子很详细,我先提了抽象问题。

抽象问题

我想反序列化一个不受我控制的类的两个属性。属性来自类型 int/外来类 NodeId。有两个静态类提供公共字段作为常量。我想从 JSON 反序列化给定静态类的名称,并从实例中的给定静态类设置相应的值。

我希望能够从 JSON 中读取的内容:

{
          "DataType": "Float","ValueRank": "Scalar"
}

我现在需要用 JSON 编写它可以工作的内容(这些是来自静态类的“翻译”值;有关更多详细信息,请参阅完整示例):

{
          "DataType": "i=10","ValueRank": -1
}

我的问题是:

  1. 我无法使用 JsonConverter 属性装饰外部类的属性
  2. 我无法对 intNodeId 类型做出反应,因为它太笼统了

我的解决方法:

  1. 以某种方式用我的“外部”属性装饰外部类属性!?!?这可能吗?
  2. 编写一个自定义反序列化器,通过反射对属性名称做出反应!?!?这可能吗?

如果上述解决方案都不起作用,我的解决方法是摆脱它:

  1. 从类派生并使用自定义反序列化器修饰派生类中的字段。
  2. 创建我自己的反序列化类,并使用我的类中的值创建外部类的实例。

包含所有细节的示例

我正在使用 OPC foundation's OPC UA stack 中的一个类,我想反序列化它。我感兴趣的课程摘录如下:

    [DataContract(Namespace = "http://opcfoundation.org/UA/2008/02/Types.xsd")]
    [GeneratedCode("Opc.Ua.ModelCompiler","1.0.0.0")]
    public class Argument : IEncodeable
    {
        ...
        [DataMember(Name = "DataType",IsRequired = false,Order = 2)]
        public NodeId DataType { get; set; }
        [DataMember(Name = "ValueRank",Order = 3)]
        public int ValueRank { get; set; }
        ...
    }

这样一个类在代码中的实例化看起来像这样:

new Argument() { DataType = DataTypeIds.Float,ValueRank = ValueRanks.Scalar },

用于常量的类如下所示:

    [GeneratedCode("Opc.Ua.ModelCompiler","1.0.0.0")]
    public static class DataTypeIds
    {
        ...
        public static readonly NodeId Float; //returns string "i=10"
        ...

}

还有这个:

    public static class ValueRanks
    {
        ...
        public const int Scalar = -1;
        ...
}

创建 Argument 硬编码的实例非常简单直接。从 JSON 反序列化它会变得很棘手,因为我无法为属性配备自定义属性,也无法对 NodeId 和 int 类型做出反应。

提前致谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)