繁体   English   中英

Json.Net中的强类型Object []

[英]Strongly typed Object[] in Json.Net

我有一个困扰我很多的问题。 我使用JSON.Net来序列化/反序列化对象。 我使用此代码通过其参数类型调用方法。

如果运行以下代码,我将得到一个对象[] {int,int}

然后,我使用Json.Net进行序列化/反序列化,并在此过程之后变为object [] {long,long}

现在我的问题是:如何更改以下代码以保留类型和值?

 static class Program
{
    static byte[] ObjectAsByteArray(object data)
    {
        string text = JsonConvert.SerializeObject(data, Formatting.None, new JsonSerializerSettings()
        {
            Formatting=Formatting.Indented,
            TypeNameHandling = TypeNameHandling.All,
            TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
        });

        return Encoding.UTF8.GetBytes(text);
    }

    static T ByteArrayAsObject<T>(byte[] data)
    {
        Object answer = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), typeof(T), new JsonSerializerSettings()
        {
            Formatting = Formatting.Indented,
            TypeNameHandling = TypeNameHandling.All,
            TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
        });
        return (T)answer;
    }

    static int Multiply(int a, int b)
    {
        return a * b;
    }


    static object[] ArgumentsOf(Expression<Action> expression)
    {
        MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
        object[] Params = outermostExpression.Arguments.Cast<ConstantExpression>().Select(x => x.Value).ToArray();

        return Params;
    }


    [STAThread]
    static void Main()
    {
        object[] Arguments = ArgumentsOf(() => Multiply(5, 100));
        byte[] ArgAsByte = ObjectAsByteArray(Arguments);

        object[] DeserializedArguments = ByteArrayAsObject<object[]>(ArgAsByte);

    }




}

您需要将ArgumentsOf更改为泛型,否则返回类型为System.Object的数组,该数组序列化为

"$type": "System.Object[], mscorlib",

但是,如果您指定int的特定类型,它将序列化为:

"$type": "System.Int32[], mscorlib",

像这样:

static T[] ArgumentsOf<T>(Expression<Func<T>> expression)
{
    MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
    var Params = outermostExpression.Arguments.Cast<ConstantExpression>().Select(x => (T)x.Value).ToArray();
    return Params;
}

那么整个样本将如下所示:

static class Program
{
static byte[] ObjectAsByteArray(object data)
{
    string text = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings()
    {
        Formatting=Newtonsoft.Json.Formatting.Indented,
        TypeNameHandling = TypeNameHandling.All,
        TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
    });

    return Encoding.UTF8.GetBytes(text);
}

static T ByteArrayAsObject<T>(byte[] data)
{
    var answer = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(data), typeof(T), new JsonSerializerSettings()
    {
        Formatting = Newtonsoft.Json.Formatting.Indented,
        TypeNameHandling = TypeNameHandling.All,
        TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Simple
    });
    return (T)answer;
}

static int Multiply(int a, int b)
{
    return a * b;
}


static T[] ArgumentsOf<T>(Expression<Func<T>> expression)
{
    MethodCallExpression outermostExpression = expression.Body as MethodCallExpression;
    var Params = outermostExpression.Arguments.Cast<ConstantExpression>().Select(x => (T)x.Value).ToArray();
    return Params;
}


[STAThread]
static void Main()
{
    var Arguments = ArgumentsOf(() => Multiply(5, 100));
    byte[] ArgAsByte = ObjectAsByteArray(Arguments);

    var DeserializedArguments = ByteArrayAsObject<int[]>(ArgAsByte);
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM