1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-14 08:43:01 +08:00

Add serialisation/deserialisation explanation

This commit is contained in:
Dan Balasescu 2021-12-03 21:29:20 +09:00
parent 9acc0556a4
commit 34b0e374d8
2 changed files with 14 additions and 0 deletions

View File

@ -2,11 +2,24 @@
// See the LICENCE file in the repository root for full licence text. // See the LICENCE file in the repository root for full licence text.
using osu.Framework.Platform; using osu.Framework.Platform;
using Newtonsoft.Json.Linq;
namespace osu.Desktop.LegacyIpc namespace osu.Desktop.LegacyIpc
{ {
/// <summary> /// <summary>
/// An <see cref="IpcMessage"/> that can be used to communicate to and from legacy clients. /// An <see cref="IpcMessage"/> that can be used to communicate to and from legacy clients.
/// <para>
/// In order to deserialise types at either end, types must be serialised as their <see cref="System.Type.AssemblyQualifiedName"/>,
/// however this cannot be done since osu!stable and osu!lazer live in two different assemblies.
/// <br />
/// To get around this, this class exists which serialises a payload (<see cref="LegacyIpcMessage.Data"/>) as an <see cref="System.Object"/> type,
/// which can be deserialised at either end because it is part of the core library (mscorlib / System.Private.CorLib).
/// The payload contains the data to be sent over the IPC channel.
/// <br />
/// At either end, Json.NET deserialises the payload into a <see cref="JObject"/> which is manually converted back into the expected <see cref="LegacyIpcMessage.Data"/> type,
/// which then further contains another <see cref="JObject"/> representing the data sent over the IPC channel whose type can likewise be lazily matched through
/// <see cref="LegacyIpcMessage.Data.MessageType"/>.
/// </para>
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Synchronise any changes with osu-stable. /// Synchronise any changes with osu-stable.

View File

@ -36,6 +36,7 @@ namespace osu.Desktop.LegacyIpc
logger.Add("Processing legacy IPC message..."); logger.Add("Processing legacy IPC message...");
logger.Add($" {msg.Value}", LogLevel.Debug); logger.Add($" {msg.Value}", LogLevel.Debug);
// See explanation in LegacyIpcMessage for why this is done this way.
var legacyData = ((JObject)msg.Value).ToObject<LegacyIpcMessage.Data>(); var legacyData = ((JObject)msg.Value).ToObject<LegacyIpcMessage.Data>();
object value = parseObject((JObject)legacyData!.MessageData, legacyData.MessageType); object value = parseObject((JObject)legacyData!.MessageData, legacyData.MessageType);