序列化和反序列化AjaxFileUploadEventArgs - 没有定义无参数构造函数'

时间:2018-03-14 14:35:04

标签: c# serialization ajaxcontroltoolkit javascriptserializer

我正在更改webform网站以使用StateServer,现在我正试图找到一种方法来序列化和反序列化AjaxFileUploadEventArgs,到目前为止我的代码:

在html中我有:

<ajaxToolkit:AjaxFileUpload
ID="AAA"
runat="server"
OnUploadComplete="OnUploadComplete"
ViewStateMode="Enabled" />

服务器:

protected void OnUploadComplete(object sender, AjaxFileUploadEventArgs file)
        {
            UpdateListInSession(file);
        }

public static void UpdateListInSession(AjaxFileUploadEventArgs file)
{
  var serializer = new JavaScriptSerializer();
  var fileSerialized = serializer.Serialize(file);
}

public static AjaxFileUploadEventArgs GetLeadsListFromSession()
{
    var serializer = new JavaScriptSerializer();
    AjaxFileUploadEventArgs file = null;

    AjaxFileUploadEventArgs deserializeFile = 
         serializer.Deserialize<AjaxFileUploadEventArgs>(
            HttpContext.Current.Session[k_file] as string);

  return deserializeFile;
}

错误:

  

System.MissingMethodException:&#39;没有为&#39; AjaxControlToolkit.AjaxFileUploadEventArgs&#39;的类型定义无参数构造函数。&#39;

1 个答案:

答案 0 :(得分:2)

假设您使用AjaxFileUploadEventArgs.cs中的,则异常消息不言自明。您正在使用的序列化程序JavaScriptSerializer只能使用无参数构造函数构造和反序列化类型,但如reference source所示,AjaxFileUploadEventArgs只有一个构造函数,它是参数化的:

public AjaxFileUploadEventArgs(string fileId, AjaxFileUploadState state, string statusMessage, string fileName, int fileSize, string contentType) {
        // Initialize fields
}

那么,你有什么选择反序列化这种类型?首先,您可以切换到支持参数化构造函数的。一旦安装了Json.NET,如果你这样做:

var deserializeFile = 
    Newtonsoft.Json.JsonConvert.DeserializeObject<AjaxFileUploadEventArgs>(jsonString);

然后它就可以了。示例fiddle。请注意,JavaScriptSerializer的{​​{3}}个州:

  

Microsoft's own documentation应该使用序列化和反序列化。

所以这可能是最好的解决方案。

如果由于某种原因无法使用Json.NET,则需要为AjaxFileUploadEventArgs编写自定义Json.NET,如下所示:

public class AjaxFileUploadEventArgsConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        var args = new AjaxFileUploadEventArgs
        (
            serializer.ConvertItemToTypeOrDefault<string>(dictionary, "FileId"),
            serializer.ConvertItemToTypeOrDefault<AjaxFileUploadState>(dictionary, "State"),
            serializer.ConvertItemToTypeOrDefault<string>(dictionary, "StatusMessage"),
            serializer.ConvertItemToTypeOrDefault<string>(dictionary, "FileName"),
            serializer.ConvertItemToTypeOrDefault<int>(dictionary, "FileSize"), 
            serializer.ConvertItemToTypeOrDefault<string>(dictionary, "ContentType")
        ) 
        { PostedUrl = serializer.ConvertItemToTypeOrDefault<string>(dictionary, "PostedUrl") };
        return args;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new[] { typeof(AjaxFileUploadEventArgs) }; }
    }
}

public static class JavaScriptSerializerExtensions
{
    public static T ConvertItemToTypeOrDefault<T>(this JavaScriptSerializer serializer, IDictionary<string, object> dictionary, string key)
    {
        object value;

        if (!dictionary.TryGetValue(key, out value))
            return default(T);

        return serializer.ConvertToType<T>(value);
    }
}

然后按如下方式反序列化:

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new JavaScriptConverter[] { new AjaxFileUploadEventArgsConverter() });
var deserializeFile = serializer.Deserialize<AjaxFileUploadEventArgs>(jsonString);