msgpack的数据序列和还原
msgpack不仅可以序列一些常规的数据类型的数据,比如:string、datetime、integer。。。。。。
还能序列olevariant、stream
这就非常强大而完美了。
procedure TynTcpMethod.SendPicture(AReceiverID: string; APicture: TMemoryStream); var LMsgPack: TSimpleMsgPack; LStream: TMemoryStream; begin LMsgPack := TSimpleMsgPack.Create; LStream := TMemoryStream.Create; try LMsgPack.clear; LMsgPack.ForcePathObject('command').AsString := 'picture'; LMsgPack.ForcePathObject('senderid').AsString := User.UserID; LMsgPack.ForcePathObject('sendername').AsString := User.UserName; LMsgPack.ForcePathObject('receiverid').AsString := AReceiverID; LMsgPack.ForcePathObject('picture').LoadBinaryFromStream(APicture); // 流序列图片或文件 LMsgPack.ForcePathObject('time').AsDateTime := Now; LMsgPack.EncodeToStream(LStream); LStream.Position := 0; IdTCPClient1.IOHandler.Write(LStream, LStream.Size, True); finally LMsgPack.Free; LStream.Free; end; end;
procedure TynTcpMethod.RecvPicture; var LUserMsg: TUserMsg; LMyMsg: TMyMSG; begin if FMsgDict.TryGetValue(FMsgPack.ForcePathObject('senderid').AsString, LUserMsg) then // 查字典 begin LMyMsg.IsMSG := False; LMyMsg.IsFile := False; LMyMsg.IsPicture := True; LMyMsg.PictureStream := TMemoryStream.Create; FMsgPack.ForcePathObject('picture').SaveBinaryToStream(LMyMsg.PictureStream); LMyMsg.Time := FMsgPack.ForcePathObject('time').AsDateTime; LMyMsg.Command := FMsgPack.ForcePathObject('command').AsString; LMyMsg.SenderId := FMsgPack.ForcePathObject('senderid').AsString; LMyMsg.SenderName := FMsgPack.ForcePathObject('sendername').AsString; LMyMsg.ReceiverId := FMsgPack.ForcePathObject('receiverid').AsString; LUserMsg.EnQueue(LMyMsg); // 消息入队 end; end;