Unity中使用Realm .NET SDK获取用户CustomData时遇字段匹配错误
解决Realm .NET SDK获取CustomData时的字段匹配错误
在Unity中使用Realm .NET SDK访问MongoDB Realm用户的CustomData时,出现错误:
An error occurred while logging in: Element 'username' does not match any field or property of class Datauser.
当前使用的Realm同步模型代码:
using System; using System.Collections.Generic; using Realms; using MongoDB.Bson; public partial class Datauser : IRealmObject { [MapTo("_id")] [PrimaryKey] public ObjectId? Id { get; set; } [MapTo("avatar")] public string? Avatar { get; set; } [MapTo("user")] public string? User { get; set; } [MapTo("username")] public string? Username { get; set; } }
获取数据的报错代码:
await _realmUser.RefreshCustomDataAsync(); Datauser customData = _realmUser.GetCustomData<Datauser>(); Debug.Log(customData);
使用无泛型方法可正常获取JSON字符串:
await _realmUser.RefreshCustomDataAsync(); var customData = _realmUser.GetCustomData(); Debug.Log(customData);
已知CustomData已启用,关联数据库字段为user。
解决方案
方案1:手动反序列化并忽略未知字段
Realm .NET的GetCustomData<T>默认采用严格反序列化规则,JSON中存在模型未定义的字段就会报错。可以先获取原始JSON字符串,再用自定义配置反序列化:
await _realmUser.RefreshCustomDataAsync(); var customDataStr = _realmUser.GetCustomData(); // 配置忽略未知字段,完成反序列化 var customData = System.Text.Json.JsonSerializer.Deserialize<Datauser>(customDataStr, new System.Text.Json.JsonSerializerOptions { IgnoreUnknownFields = true }); Debug.Log(customData);
方案2:补充模型的字段映射
检查GetCustomData()返回的JSON字符串,确认所有存在的字段,将未在Datauser中定义的字段补充到模型里,并添加[MapTo]映射。例如如果JSON包含email字段,就添加:
[MapTo("email")] public string? Email { get; set; }
方案3:修改模型的序列化规则
在Datauser类上添加属性,允许模型接受未定义的字段:
using System; using System.Collections.Generic; using Realms; using MongoDB.Bson; [RealmSchema(OptionalProperties = new[] { "*" })] public partial class Datauser : IRealmObject { [MapTo("_id")] [PrimaryKey] public ObjectId? Id { get; set; } [MapTo("avatar")] public string? Avatar { get; set; } [MapTo("user")] public string? User { get; set; } [MapTo("username")] public string? Username { get; set; } }
问题核心原因
GetCustomData<T>反序列化时,返回的CustomData JSON中包含Datauser模型未定义的字段(或字段映射不匹配),而默认序列化规则不允许未知字段存在。无泛型方法仅返回原始JSON字符串,因此不会触发校验错误。
内容的提问来源于stack exchange,提问作者Filippo Murolo
相关产品推荐
相关产品推荐

