问题描述
因为下面的例子很详细,我先提了抽象问题。
抽象问题
我想反序列化一个不受我控制的类的两个属性。属性来自类型 int/外来类 NodeId。有两个静态类提供公共字段作为常量。我想从 JSON 反序列化给定静态类的名称,并从实例中的给定静态类设置相应的值。
我希望能够从 JSON 中读取的内容:
{
"DataType": "Float","ValueRank": "Scalar"
}
我现在需要用 JSON 编写它可以工作的内容(这些是来自静态类的“翻译”值;有关更多详细信息,请参阅完整示例):
{
"DataType": "i=10","ValueRank": -1
}
我的问题是:
- 我无法使用 JsonConverter 属性装饰外部类的属性
- 我无法对
int
或NodeId
类型做出反应,因为它太笼统了
我的解决方法:
- 以某种方式用我的“外部”属性装饰外部类属性!?!?这可能吗?
- 编写一个自定义反序列化器,通过反射对属性名称做出反应!?!?这可能吗?
如果上述解决方案都不起作用,我的解决方法是摆脱它:
- 从类派生并使用自定义反序列化器修饰派生类中的字段。
- 创建我自己的反序列化类,并使用我的类中的值创建外部类的实例。
包含所有细节的示例
我正在使用 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 (将#修改为@)