fix network messages not using same JSON serializer settings (#745)

This commit is contained in:
Jesse Plamondon-Willard 2021-01-01 11:51:57 -05:00
parent f95292953f
commit 0fdb09f5f9
No known key found for this signature in database
GPG Key ID: CF8B1456B3E29F49
4 changed files with 16 additions and 3 deletions

View File

@ -14,6 +14,7 @@
* For modders:
* When a mod is blocked by SMAPI's internal compatibility list, the `TRACE` messages while loading it now indicates that and specifies the reason.
* Message data from the `ModMessageReceived` event now uses the same serializer settings as the rest of SMAPI. This mainly adds support for sending crossplatform `Color`, `Point`, `Vector2`, `Rectangle`, and `SemanticVersion` fields through network messages.
## 3.8.1
Released 26 December 2020 for Stardew Valley 1.5.1 or later.

View File

@ -132,5 +132,11 @@ namespace StardewModdingAPI.Toolkit.Serialization
{
return JsonConvert.SerializeObject(model, formatting, this.JsonSettings);
}
/// <summary>Get a low-level JSON serializer matching the <see cref="JsonSettings"/>.</summary>
public JsonSerializer GetSerializer()
{
return JsonSerializer.CreateDefault(this.JsonSettings);
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using StardewModdingAPI.Framework.Networking;
using StardewModdingAPI.Toolkit.Serialization;
namespace StardewModdingAPI.Events
{
@ -12,6 +13,9 @@ namespace StardewModdingAPI.Events
/// <summary>The underlying message model.</summary>
private readonly ModMessageModel Message;
/// <summary>The JSON helper used to deserialize models.</summary>
private readonly JsonHelper JsonHelper;
/*********
** Accessors
@ -31,16 +35,18 @@ namespace StardewModdingAPI.Events
*********/
/// <summary>Construct an instance.</summary>
/// <param name="message">The received message.</param>
internal ModMessageReceivedEventArgs(ModMessageModel message)
/// <param name="jsonHelper">The JSON helper used to deserialize models.</param>
internal ModMessageReceivedEventArgs(ModMessageModel message, JsonHelper jsonHelper)
{
this.Message = message;
this.JsonHelper = jsonHelper;
}
/// <summary>Read the message data into the given model type.</summary>
/// <typeparam name="TModel">The message model type.</typeparam>
public TModel ReadAs<TModel>()
{
return this.Message.Data.ToObject<TModel>();
return this.Message.Data.ToObject<TModel>(this.JsonHelper.GetSerializer());
}
}
}

View File

@ -1128,7 +1128,7 @@ namespace StardewModdingAPI.Framework
modIDs.Remove(message.FromModID); // don't send a broadcast back to the sender
// raise events
this.EventManager.ModMessageReceived.Raise(new ModMessageReceivedEventArgs(message), mod => mod != null && modIDs.Contains(mod.Manifest.UniqueID));
this.EventManager.ModMessageReceived.Raise(new ModMessageReceivedEventArgs(message, this.Toolkit.JsonHelper), mod => mod != null && modIDs.Contains(mod.Manifest.UniqueID));
}
/// <summary>Constructor a content manager to read game content files.</summary>