diff --git a/osu.Game/Online/API/APIAccess.cs b/osu.Game/Online/API/APIAccess.cs
index b35dfa11cb..f7a3f4602f 100644
--- a/osu.Game/Online/API/APIAccess.cs
+++ b/osu.Game/Online/API/APIAccess.cs
@@ -257,8 +257,8 @@ namespace osu.Game.Online.API
this.password = password;
}
- public IHubClientConnector GetHubConnector(string clientName, string endpoint) =>
- new HubClientConnector(clientName, endpoint, this, versionHash);
+ public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) =>
+ new HubClientConnector(clientName, endpoint, this, versionHash, preferMessagePack);
public RegistrationRequest.RegistrationRequestErrors CreateAccount(string email, string username, string password)
{
diff --git a/osu.Game/Online/API/DummyAPIAccess.cs b/osu.Game/Online/API/DummyAPIAccess.cs
index 52f2365165..1ba31db9fa 100644
--- a/osu.Game/Online/API/DummyAPIAccess.cs
+++ b/osu.Game/Online/API/DummyAPIAccess.cs
@@ -89,7 +89,7 @@ namespace osu.Game.Online.API
state.Value = APIState.Offline;
}
- public IHubClientConnector GetHubConnector(string clientName, string endpoint) => null;
+ public IHubClientConnector GetHubConnector(string clientName, string endpoint, bool preferMessagePack) => null;
public RegistrationRequest.RegistrationRequestErrors CreateAccount(string email, string username, string password)
{
diff --git a/osu.Game/Online/API/IAPIProvider.cs b/osu.Game/Online/API/IAPIProvider.cs
index 3a77b9cfee..686df5c57c 100644
--- a/osu.Game/Online/API/IAPIProvider.cs
+++ b/osu.Game/Online/API/IAPIProvider.cs
@@ -102,7 +102,8 @@ namespace osu.Game.Online.API
///
/// The name of the client this connector connects for, used for logging.
/// The endpoint to the hub.
- IHubClientConnector? GetHubConnector(string clientName, string endpoint);
+ ///
+ IHubClientConnector? GetHubConnector(string clientName, string endpoint, bool preferMessagePack = true);
///
/// Create a new user account. This is a blocking operation.
diff --git a/osu.Game/Online/HubClientConnector.cs b/osu.Game/Online/HubClientConnector.cs
index 3876c8bbe6..6c6a217f54 100644
--- a/osu.Game/Online/HubClientConnector.cs
+++ b/osu.Game/Online/HubClientConnector.cs
@@ -26,6 +26,7 @@ namespace osu.Game.Online
private readonly string clientName;
private readonly string endpoint;
private readonly string versionHash;
+ private readonly bool preferMessagePack;
private readonly IAPIProvider api;
///
@@ -51,12 +52,14 @@ namespace osu.Game.Online
/// The endpoint to the hub.
/// An API provider used to react to connection state changes.
/// The hash representing the current game version, used for verification purposes.
- public HubClientConnector(string clientName, string endpoint, IAPIProvider api, string versionHash)
+ /// Whether to use MessagePack for serialisation if available on this platform.
+ public HubClientConnector(string clientName, string endpoint, IAPIProvider api, string versionHash, bool preferMessagePack = true)
{
this.clientName = clientName;
this.endpoint = endpoint;
this.api = api;
this.versionHash = versionHash;
+ this.preferMessagePack = preferMessagePack;
apiState.BindTo(api.State);
apiState.BindValueChanged(state =>
@@ -144,7 +147,7 @@ namespace osu.Game.Online
options.Headers.Add("OsuVersionHash", versionHash);
});
- if (RuntimeInfo.SupportsJIT)
+ if (RuntimeInfo.SupportsJIT && preferMessagePack)
builder.AddMessagePackProtocol();
else
{
diff --git a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
index 8137430d8e..1dfc60312b 100644
--- a/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
+++ b/osu.Game/Online/Multiplayer/OnlineMultiplayerClient.cs
@@ -37,7 +37,9 @@ namespace osu.Game.Online.Multiplayer
[BackgroundDependencyLoader]
private void load(IAPIProvider api)
{
- connector = api.GetHubConnector(nameof(OnlineMultiplayerClient), endpoint);
+ // Importantly, we are intentionally not using MessagePack here to correctly support derived class serialization.
+ // More information on the limitations / reasoning can be found in osu-server-spectator's initialisation code.
+ connector = api.GetHubConnector(nameof(OnlineMultiplayerClient), endpoint, false);
if (connector != null)
{