2

我已使用默认会话将 xpo 对象序列化为单独项目中的 JSON 数据。但是当我尝试在视图控制器中反序列化相同的内容时,我收到了默认会话错误。我能够获取当前会话,但我不确定如何使用当前会话进行反序列化。

Newtonsoft 被用于序列化和反序列化。

string filetext= File.ReadAllText("importedfile.json");
Plugin pl = (Plugin)JsonConvert.DeserializeObject(filetext,jsonsettings);

Plugin 是我的类名,JSON 数据应该被反序列化到该类名。

4

1 回答 1

1

假设您的类型以文档示例中所示的方式Plugin继承:DevExpress.Xpo.XPObject

public class Plugin : XPObject {
    // XPObject has a built-in Integer key and you can't add a custom key
    public Plugin(Session session) : base(session) { }
    string fMyProperty;
    public string MyProperty {
        get { return fMyProperty; }
        set { SetPropertyValue(nameof(fMyProperty), ref fMyProperty, value); }
    }
}

并假设您的反序列化代码已经可以访问 some Session session,然后定义以下内容CustomCreationConverter<Plugin>

public class PluginConverter : CustomCreationConverter<Plugin>
{
    DevExpress.Xpo.Session Session { get; }

    public PluginConverter(DevExpress.Xpo.Session session) => this.Session = session ?? throw new ArgumentNullException();

    public override Plugin Create(Type objectType) => new Plugin(Session);
}

并反序列化如下:

Session session; // Your session

var jsonsettings = new JsonSerializerSettings
{
    Converters = { new PluginConverter(session), /* Other converters as required */ },
    // Other settings as required
};
var pl = JsonConvert.DeserializeObject<Plugin>(filetext, jsonsettings);

反序列化类型时,将调用Plugin转换器的方法以使用提供的会话来制造。Create()Plugin

如果您使用多个会话,则需要JsonSerializerSettings为每个新会话使用一个新会话。

此模式可用于任何继承自带XPObjectSession对象的公共构造函数的类型。

于 2021-07-07T15:32:24.353 回答