我想缓存到本地存储HttpRequest和HttpSolutions类从@角/通用/超文本传输协议
。
localstorage
只接受string
,因此我想用JSON序列化/取消序列化这两个对象(HttpRequest和HttpResponse)。stringfy()
和JSON。parse()
。
问题是HttpRequest
和HttpResponse
都是复杂的类,带有一些ES6映射(例如HttpHeaders)和一些getter/setter函数,带有JSON。stringfy()
和JSON。parse()
序列化/非序列化不会返回相同的对象,并且某些信息会丢失。
有一种方法可以序列化/取消序列化HttpRequest
和HttpResponse
类?
我正在搜索完整的序列化/非序列化(标题、参数、正文等)
在本例中,有两种方法用于序列化和取消序列化HttpRequest,例如:
function serializeRequest(angularRequest: HttpRequest): string {
return null; // to implement
}
function unserializeRequest(jsonRequest: string): HttpRequest {
return null; // to implement
}
// this is an example of request
const originalRequest = new HttpRequest('POST', 'https://angular.io/docs?foo=bar', {foo: true}, {
params: new HttpParams().set('verbose', 'true'),
headers: new HttpHeaders({
BAR: 'baz',
}),
reportProgress: true,
responseType: 'json',
withCredentials: true
});
// serializeRequest trasform HttpRequest in json format
const jsonRequest: string = serializeRequest(originalRequest);
// unserializeRequest trasform json format to HttpRequest
const unserializedRequest : HttpRequest = unserializeRequest(jsonRequest);
// unserializedRequest as same object of originalRequest
expect(originalRequest).toEqual(unserializedRequest);
响应的相同序列化/反序列化
function serializeResponse(angularResponse: HttpResponse): string {
return null; // to implement
}
function unserializeResponse(jsonResponse: string): HttpResponse {
return null; // to implement
}
// this is an example of response
const originalResponse = new HttpResponse({
headers: new HttpHeaders({
BAR: 'baz',
}),
status: 200,
statusText: 'OK',
url: 'https://angular.io/docs',
body: {foo: true}}
);
// serializeResponse trasform HttpResponse in json format
const jsonResponse: string = serializeResponse(originalRequest);
// unserializeResponse trasform json format to HttpResponse
const unserializedResponse: HttpResponse = unserializeResponse(jsonResponse);
// unserializedResponse as same object of originalResponse
expect(originalResponse).toEqual(unserializedResponse);
下面提到的方法是在Angular中序列化Http响应的最佳方法。res.json()函数将显示正文、标头和参数。
this.http.get('/app/lists.json').map((res:Response) => res.json());
如果您只是想序列化HttpRequest,那么类本身提供了序列化身体()
方法,在这里
虽然我会推荐一个服务工作者进行缓存,但我所知道的最简单的方法是克隆请求/响应,然后获取它们的信息:
function serializeRequest(req: HttpRequest<any>): string {
const request = req.clone(); // Make a clone, useful for doing destructive things
return JSON.stringify({
headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer
request.headers.keys.map( // Get all of the headers
(key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers
)
),
method: request.method, // The Request Method, e.g. GET, POST, DELETE
url: request.url, // The URL
params: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer
request.headers.keys.map( // Get all of the headers
(key: string) => [key, request.headers.getAll(key)] // Get all of the corresponding values for the headers
)
), // The request parameters
withCredentials: request.withCredentials, // Whether credentials are being sent
respnseType: request.responseType, // The response type
body: request.serializeBody() // Serialize the body, all well and good since we are working on a clone
})
}
以类似的方式,我们也可以序列化响应(假设T
与JSON兼容,这在HTTP请求中是一个公平的假设):
function serializeResponse(res: HttpResponse<any>): string {
const response = res.clone();
return JSON.stringify({
headers: Object.fromEntries( // Just a helper to make this into an object, not really required but makes the output nicer
response.headers.keys.map( // Get all of the headers
(key: string) => [key, response.headers.getAll(key)] // Get all of the corresponding values for the headers
)
),
status: response.status,
statusText: response.statusText,
url: response.url,
body: response // Serialize the body, all well and good since we are working on a clone
})
}
然后,由于我们保存了所有必需的信息,因此反序列化是一件轻而易举的事:
function deserializeRequest<T = any>(req: string): HttpRequest<T> {
const request = JSON.parse(req);
const headers = new HttpHeaders(request.headers);
const params = new HttpParams(); // Probably some way to make this a one-liner, but alas, there are no good docs
for(let parameter in request.params){
request.params[parameter].forEach((paramValue: string) => params.append(parameter, paramValue));
}
return new HttpRequest(request.method, request.url, request.body, {
headers,
params,
respnseType: request.respnseType,
withCredentials: request.withCredentials
});
}
function deserializeResponse<T = any>(res: string): HttpResponse<T> {
const response = JSON.parse(res);
const headers = new HttpHeaders(response.headers);
return new HttpRequest({
headers,
body: response.body,
status: response.status,
statusText: response.statusText,
url: response.url,
});
}
整个事情的操场(虽然,遗憾的是,角度类型不能正确加载)
请注意,我没有在任何环境中测试过这一点,因此这是按原样提供的,我不确定expect
如何处理两个HttpHeaders
/HttpParams
,尤其是因为它们的顺序可能不完全相同。
本文向大家介绍java对象的序列化和反序列化,包括了java对象的序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java对象的序列化和反序列化,供大家参考,具体内容如下 1. 什么是序列化 将对象转换为字节流保存起来,比如保存到文件里,并在以后还原这个对象,这种机制叫做对象序列化。(补充一句:把对象保存到永久存储设备上称为持久化) 2. 怎么实现序列化
我已经开始将一个项目从使用Java标准日期迁移到Joda DateTime。 我的项目使用XML序列化将对象保存到XML文件中。在这个特殊的例子中,我有一个Item类,它有一个DateTime属性。 在某个时候,我正在初始化对象,包括像这样的DateTime属性: 我使用XMLEncoder使用辅助类序列化项目: 显然,日期时间被保存在xml中。。。但毫无价值: 显然,它没有保存任何东西,但不,它
我试图序列化一个对象数组,并将其写入一个名为address.ser的文件,然后从该文件中读取,反序列化对象数组并显示其属性。我尝试一次序列化整个arrayList(读取时在单个会话中反序列化它),也尝试一个接一个地序列化对象数组的每个对象(读取时一个接一个地反序列化它)。问题是,当从address.ser文件读回来时,我只得到最后一个被写入的对象的数据,而不是其他的。 以下是代码片段: 这是用于将
本文向大家介绍详解Java 对象序列化和反序列化,包括了详解Java 对象序列化和反序列化的使用技巧和注意事项,需要的朋友参考一下 之前的文章中我们介绍过有关字节流字符流的使用,当时我们对于将一个对象输出到流中的操作,使用DataOutputStream流将该对象中的每个属性值逐个输出到流中,读出时相反。在我们看来这种行为实在是繁琐,尤其是在这个对象中属性值很多的时候。基于此,Java中对象的序列
以下代码导致此异常: 所以问题是:如何在GSON序列化和反序列化的泛型HashMap中获得正确的实例?
使用反序列化对象时,我遇到以下错误: JSONMappingException无法构造组织的实例。springframework。数据页,问题:抽象类型只能用附加类型信息进行实例化。 我试图将JSON字符串序列化为Spring数据对象,表示类型为的页面。 类是一个简单的POJO,具有和名称。我正在反序列化的JSON字符串是: 这会导致异常: 因为是Spring对象,所以我不能修改它,我认为这与我在