我使用RestSharp作为Silverlight项目的HTTP API客户端。如果没有互联网连接,我想以字符串的形式序列化休息请求对象并将其保存到本地存储。当互联网连接启动时,我将反序列化该字符串,获取原始对象并再次发送请求。到目前为止,我尝试了以下方法来序列化/反序列化rest请求对象:
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 。以下是例外情况:
键入&#39; RestSharp.Serializers.JsonSerializer&#39;数据合同名称&#39; JsonSerializer:http://schemas.datacontract.org/2004/07/RestSharp.Serializers&#39;不是预期的。将任何静态未知的类型添加到已知类型列表中 - 例如,使用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;
}
}
经过大量调查后,我无法找到异常验证的方法来序列化/反序列化其他请求对象。有人能在我的代码中发现故障吗?任何帮助将不胜感激。
答案 0 :(得分:0)
你试过protobuf-net吗?它是Google的超高效协议缓冲区的.NET实现,由Marc Gravel编写并在Stack Exchange中使用。比XML序列化更快/更便宜/更小,并且根据文档支持Silverlight。
答案 1 :(得分:0)
如果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,并且可能根本没有设计序列化。