【问题标题】:How to serialize / deserialize RestSharp RestRequest如何序列化/反序列化 RestSharp RestRequest
【发布时间】:2014-06-19 09:20:20
【问题描述】:

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

1) Silverlight 序列化器 :它可以序列化一些休息请求。但是对于某些类型的请求,它会在序列化对象时抛出 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。以下是异常详情:

不应使用数据协定名称“JsonSerializer:http://schemas.datacontract.org/2004/07/RestSharp.Serializers”键入“RestSharp.Serializers.JsonSerializer”。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 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;
    }
}

经过大量调查,我无法找到序列化/反序列化休息请求对象的防异常方法。有人能在我的代码中发现故障吗?任何帮助将不胜感激。

【问题讨论】:

  • 它必须是模型(类型)中的某些内容。您是否尝试在 JSON 中反序列化 XML?

标签: c# silverlight serialization restsharp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果 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 包含硬引用序列化程序对象和 lots of other stuff,并且可能根本没有考虑到序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多