首页 > 解决方案 > 为 DataContractJsonSerializer 设置额外的调用者定义的上下文

问题描述

因为BinaryFormatter我可以设置一个额外的调用者定义的上下文,它将作为参数传递给反序列化后调用的方法,例如用[OnDeserialized]属性装饰。
调用用[OnDeserialized]for装饰的方法可以DataContractJsonSerializer工作,但是如何为其设置额外的调用者定义的上下文?可能吗?
我想避免SetBusinessObj(..)在反序列化后手动调用一些专用方法。

var businessObject = "some business object";
var serObj = new SerialClass(businessObject) { Data1 = "some data1" };
using(var ms = new MemoryStream())
{
    var bf = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Other, businessObject));
    bf.Serialize(ms, serObj);
    ms.Flush();
    ms.Position = 0;
    var deserObj = bf.Deserialize(ms);
}
using(var ms = new MemoryStream())
{
    //How to set an additional caller-defined context?
    var jsnSer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(SerialClass));
    jsnSer.WriteObject(ms, serObj);
    ms.Flush();
    ms.Position = 0;
    var deserObj = jsnSer.ReadObject(ms);
}

[Serializable]
class SerialClass
{
    public string Data1 { get; set; }
    private object _businessObj = null;
    public SerialClass(object bo)
    {
        _businessObj = bo;
    }
    [OnDeserialized]
    private void OnDeserialized(StreamingContext sctx)
    {
        if(sctx.Context is string dataIsHere)
        {
            _businessObj = dataIsHere;
        }
    }
}

标签: c#serializationjson-deserializationdatacontractjsonserializer

解决方案


推荐阅读