@@ -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