Skip to content

Commit 8d2e8c6

Browse files
authored
Merge pull request #169 from dotnet-campus/t/lvyi/compatibility
加回序列化和反序列化消息的方法,因为上次升级发生了不兼容的 API 变化
2 parents d4ca12e + 3fac5b9 commit 8d2e8c6

File tree

4 files changed

+77
-11
lines changed

4 files changed

+77
-11
lines changed

src/dotnetCampus.Ipc/CompilerServices/GeneratedProxies/Contexts/GeneratedIpcJointResponse.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using dotnetCampus.Ipc.CompilerServices.GeneratedProxies.Models;
2+
using dotnetCampus.Ipc.Context;
23
using dotnetCampus.Ipc.Messages;
34
using dotnetCampus.Ipc.Serialization;
45

@@ -26,7 +27,7 @@ internal static async Task<GeneratedIpcJointResponse> FromAsyncReturnModel(
2627
var returnModel = await asyncReturnModel.ConfigureAwait(false);
2728
var message = returnModel is null
2829
? new IpcMessage()
29-
: serializer.SerializeToIpcMessage(returnModel, "Return");
30+
: serializer.SerializeToIpcMessage((ulong)KnownMessageHeaders.RemoteObjectMessageHeader, returnModel, "Return");
3031
return new GeneratedIpcJointResponse(message);
3132
}
3233
}

src/dotnetCampus.Ipc/CompilerServices/GeneratedProxies/PublicIpcJointManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public void AddPublicIpcObject(Type contractType, GeneratedIpcJoint joint, strin
7070
/// </returns>
7171
public bool TryJoint(IIpcRequestContext request, out Task<IIpcResponseMessage> responseTask)
7272
{
73-
if (Context.ObjectSerializer.TryDeserializeFromIpcMessage<GeneratedProxyMemberInvokeModel>(request.IpcBufferMessage, out var requestModel)
73+
if (Context.ObjectSerializer.TryDeserializeFromIpcMessage<GeneratedProxyMemberInvokeModel>(
74+
request.IpcBufferMessage, (ulong)KnownMessageHeaders.RemoteObjectMessageHeader, out var requestModel)
7475
&& TryFindJoint(requestModel, out var joint)
7576
&& requestModel.MemberName is { } memberName)
7677
{

src/dotnetCampus.Ipc/CompilerServices/GeneratedProxies/Utils/IpcProxyInvokingHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using dotnetCampus.Ipc.CompilerServices.GeneratedProxies.Models;
2+
using dotnetCampus.Ipc.Context;
23
using dotnetCampus.Ipc.Exceptions;
34
using dotnetCampus.Ipc.Serialization;
45

@@ -92,10 +93,11 @@ internal string TypeName
9293
return null;
9394
}
9495

95-
var requestMessage = Context.ObjectSerializer.SerializeToIpcMessage(model, model.ToString());
96+
var header = (ulong)KnownMessageHeaders.RemoteObjectMessageHeader;
97+
var requestMessage = Context.ObjectSerializer.SerializeToIpcMessage(header, model, model.ToString());
9698
//requestMessage = new IpcMessage(requestMessage.Tag, requestMessage.Body, CoreMessageType.JsonObject);
9799
var responseMessage = await PeerProxy.GetResponseAsync(requestMessage).ConfigureAwait(false);
98-
if (Context.ObjectSerializer.TryDeserializeFromIpcMessage<GeneratedProxyMemberReturnModel>(responseMessage, out var returnModel))
100+
if (Context.ObjectSerializer.TryDeserializeFromIpcMessage<GeneratedProxyMemberReturnModel>(responseMessage, header, out var returnModel))
99101
{
100102
return returnModel;
101103
}

src/dotnetCampus.Ipc/Serialization/JsonIpcMessageSerializer.cs

Lines changed: 69 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,76 @@ namespace dotnetCampus.Ipc.Serialization;
1515
/// <summary>
1616
/// 如果某 IPC 消息计划以 JSON 格式传输,那么可使用此类型来序列化和反序列化。
1717
/// </summary>
18-
internal static class JsonIpcMessageSerializer
18+
public static class JsonIpcMessageSerializer
1919
{
20+
#if UseNewtonsoftJson
21+
/// <summary>
22+
/// 将 IPC 模块自动生成的内部模型序列化成可供跨进程传输的 IPC 消息。
23+
/// </summary>
24+
/// <param name="tag"></param>
25+
/// <param name="model"></param>
26+
/// <returns></returns>
27+
[Obsolete("因为 AOT 需要,此方法已计划删除。请自行序列化后,通过 new IpcMessage(tag, new IpcMessageBody(data), header) 创建 IPC 消息。")]
28+
public static IpcMessage Serialize(string tag, object model)
29+
{
30+
return SerializeToIpcMessage(IpcConfiguration.DefaultNewtonsoftJsonSerializer, 0, model, tag);
31+
}
32+
33+
/// <summary>
34+
/// 尝试将跨进程传输过来的 IPC 消息反序列化成 IPC 模块自动生成的内部模型。
35+
/// </summary>
36+
/// <param name="message">IPC 消息。</param>
37+
/// <param name="model"></param>
38+
/// <returns></returns>
39+
[Obsolete("因为 AOT 需要,此方法已计划删除。请自行序列化后,通过 new IpcMessage(tag, new IpcMessageBody(data), header) 创建 IPC 消息。")]
40+
public static bool TryDeserialize<T>(IpcMessage message, [NotNullWhen(true)] out T? model) where T : class, new()
41+
{
42+
return IpcConfiguration.DefaultNewtonsoftJsonSerializer.TryDeserializeFromIpcMessage(message, 0, out model);
43+
}
44+
#else
45+
/// <summary>
46+
/// 将 IPC 模块自动生成的内部模型序列化成可供跨进程传输的 IPC 消息。
47+
/// </summary>
48+
/// <param name="tag"></param>
49+
/// <param name="model"></param>
50+
/// <returns></returns>
51+
[Obsolete("因为 AOT 需要,此方法已删除。请自行序列化后,通过 new IpcMessage(tag, new IpcMessageBody(data), header) 创建 IPC 消息。", true)]
52+
public static IpcMessage Serialize(string tag, object model)
53+
{
54+
return SerializeToIpcMessage(IpcConfiguration.DefaultSystemTextJsonIpcObjectSerializer, 0, model, tag);
55+
}
56+
57+
/// <summary>
58+
/// 尝试将跨进程传输过来的 IPC 消息反序列化成 IPC 模块自动生成的内部模型。
59+
/// </summary>
60+
/// <param name="message">IPC 消息。</param>
61+
/// <param name="model"></param>
62+
/// <returns></returns>
63+
[Obsolete("因为 AOT 需要,此方法已删除。请自行序列化后,通过 new IpcMessage(tag, new IpcMessageBody(data), header) 创建 IPC 消息。", true)]
64+
public static bool TryDeserialize<T>(IpcMessage message, [NotNullWhen(true)] out T? model) where T : class, new()
65+
{
66+
return IpcConfiguration.DefaultSystemTextJsonIpcObjectSerializer.TryDeserializeFromIpcMessage(message, 0, out model);
67+
}
68+
#endif
69+
2070
/// <summary>
2171
/// 将 IPC 内部模型序列化成可供跨进程传输的 IPC 消息。
2272
/// </summary>
2373
/// <param name="serializer">IPC 对象序列化器。</param>
74+
/// <param name="header">消息头。</param>
2475
/// <param name="model">要序列化的 IPC 内部模型。</param>
2576
/// <param name="tag">用于追踪调试的消息标签。</param>
2677
/// <returns>用于 IPC 传输的消息。</returns>
2778
internal static IpcMessage SerializeToIpcMessage(
2879
this IIpcObjectSerializer serializer,
80+
ulong header,
2981
object model,
3082
string tag)
3183
{
3284
var data = serializer.Serialize(model);
33-
var message = new IpcMessage(tag, new IpcMessageBody(data), (ulong) KnownMessageHeaders.RemoteObjectMessageHeader);
85+
var message = header is 0
86+
? new IpcMessage(tag, new IpcMessageBody(data))
87+
: new IpcMessage(tag, new IpcMessageBody(data), header);
3488
return message;
3589
}
3690

@@ -39,20 +93,28 @@ internal static IpcMessage SerializeToIpcMessage(
3993
/// </summary>
4094
/// <param name="serializer"></param>
4195
/// <param name="message">IPC 消息。</param>
96+
/// <param name="header">消息头。</param>
4297
/// <param name="model"></param>
4398
/// <returns></returns>
44-
internal static bool TryDeserializeFromIpcMessage<T>(this IIpcObjectSerializer serializer, IpcMessage message, [NotNullWhen(true)] out T? model)
99+
internal static bool TryDeserializeFromIpcMessage<T>(this IIpcObjectSerializer serializer,
100+
IpcMessage message, ulong header, [NotNullWhen(true)] out T? model)
45101
where T : class, new()
46102
{
47-
const ulong header = (ulong) KnownMessageHeaders.RemoteObjectMessageHeader;
48-
if (!message.TryGetPayload(header, out var deserializeMessage))
103+
IpcMessageBody body;
104+
if (header is 0)
105+
{
106+
body = message.Body;
107+
}
108+
else if (!message.TryGetPayload(header, out var deserializeMessage))
49109
{
50110
// 如果业务头不对,那就不需要解析了。
51111
model = null;
52112
return false;
53113
}
54-
55-
var body = deserializeMessage.Body;
114+
else
115+
{
116+
body = deserializeMessage.Body;
117+
}
56118

57119
try
58120
{

0 commit comments

Comments
 (0)