如何序列化/反序列化RestSharp RestRequest

本文关键字:RestSharp RestRequest 反序列化 序列化 | 更新日期: 2023-09-27 18:09:12

我使用RestSharp作为我的Silverlight项目的HTTP API客户端。如果没有互联网连接,我想以字符串的形式序列化rest请求对象,并将其保存到本地存储。当网络连接正常时,我将反序列化那个字符串,获取原始对象并再次发送请求。到目前为止,我尝试了以下方法来序列化/反序列化rest请求对象:

1) Silverlight serializer:它可以序列化一些rest请求。但是对于某些类型的请求,它抛出System。在序列化对象时出现ArgumentException。下面是异常细节:

偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数。

public static string Serialize(object objectToSerialize)
{
      byte[] serializedBytes = SilverlightSerializer.Serialize(objectToSerialize);
      var serializedCharacters = new char[serializedBytes.Length/sizeof (char)];
      Buffer.BlockCopy(serializedBytes, 0, serializedCharacters, 0, serializedBytes.Length);
      return new string(serializedCharacters);
}
public static T Deserialize<T>(string serializedString) where T : class
{
       var serializedBytes = new byte[serializedString.Length*sizeof (char)];
       Buffer.BlockCopy(serializedString.ToCharArray(), 0, serializedBytes, 0, serializedBytes.Length);
       return SilverlightSerializer.Deserialize<T>(serializedBytes);
}

2) DataContractSerializer:抛出System.Runtime.Serialization。序列化对象时SerializationException。下面是异常的详细信息:

RestSharp.Serializers类型"。JsonSerializer'与数据契约名称'JsonSerializer:http://schemas.datacontract.org/2004/07/RestSharp.Serializers'不被期望。将任何静态未知类型添加到已知类型列表中—例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。

public static string Serialize(object objectToSerialize)
{
    try
    {
        var dataContractSerializer = new DataContractSerializer(objectToSerialize.GetType());
        var memoryStream = new MemoryStream();
        dataContractSerializer.WriteObject(memoryStream, objectToSerialize);
        return Encoding.UTF8.GetString(memoryStream.GetBuffer(), 0, (int) memoryStream.Position);
    }
    catch (Exception exception)
    {
        MessageBox.Show("Message:'n" + exception.Message + "'nStackTrace:'n" + exception.StackTrace,
            "Error in serialization", MessageBoxButton.OK);
        throw;
    }
}
public static T Deserialize<T>(string serializedString) where T : class
{
    try
    {
        var dataContractSerializer = new DataContractSerializer(typeof (T));
        var memoryStream = new MemoryStream(Encoding.UTF8.GetBytes(serializedString));
        return (T) dataContractSerializer.ReadObject(memoryStream);
    }
    catch (Exception exception)
    {
        MessageBox.Show("Message:'n" + exception.Message + "'nStackTrace:'n" + exception.StackTrace,
            "Error in deserialization", MessageBoxButton.OK);
        throw;
    }
}

经过大量的调查,我还没能找到防止异常的方法来序列化/反序列化rest请求对象。有人能在我的代码中找到故障吗?

如何序列化/反序列化RestSharp RestRequest

你试过protobuf-net吗?它是Google超高效协议缓冲区的。net实现,由Marc Gravel编写,在Stack Exchange上使用。比XML序列化更快/更便宜/更小,并且根据文档支持Silverlight。

如果protobuf不起作用,我会诚实地放弃,并定义一个可以序列化的自定义类来存储重构RestRequest对象所需的一切。比如:

public class RestRequestData
{
    public HttpMethod HttpMethod { get; set; }
    public object ContentData { get; set; }
    public IDictionary Headers { get; set; }
    // whatever else is needed
}

然后针对该类型编写序列化代码,并添加一对方法从RestRequest映射到RestRequestData,反之亦然。

可能不是您希望的答案,但是RestRequest包含硬引用序列化器对象和许多其他东西,并且可能根本没有考虑到序列化。