Newtonsoft.Json不序列化属性

kxkpmulp  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(142)

我有一个fixedPoint数学库对象,在几个字段中有实际的值,然后像十亿个属性,似乎保存了这些值的转换版本,以便沿着或其他东西?

I.E. 
//important info
public fp x = 0;
public fp y = 0;

//not important info
public fp4 xxxx { get; }
public fp4 xxxy { get; }
public fp4 xxyx { get; }
etc times a billion...

字符串
显然,我唯一希望序列化的是重要的变量。我花了几个小时试图弄清楚为什么json试图比较我没有做的变量,只是发现这是因为这些属性,而它正在检查循环引用,并抛出我吨的错误。现在我正在撕扯我的头发,看起来应该是基本的功能XD。如有任何帮助,我们将不胜感激。如果我不需要编辑库文件本身,那就更好了,因为如果我从那个仓库更新,那可能会中断。
重申一下,我只想序列化字段。无属性。
编辑:对于其他有这个问题的人。我不能让Newtonsoft做我想做的事情,但是常规的内置JsonUtility工作得很好,没有额外的步骤:
第一个月
我以前试过,但有问题,原来我愚蠢的自我忘记了我的一个结构上的[Serializable]标签非常尴尬。😅
但在那之后,我意识到它也不适合我的其他一些不相关的需求,所以我最终切换到OdinInspector序列化器,它也工作得很好,没有任何其他步骤。它甚至支持序列化System.Object!
Sirenix.Serialization.SerializationUtility.SerializeValue(data, Sirenix.Serialization.DataFormat.JSON);
显然,我想要的是足够基本的功能,使默认的其他东西哈哈。
感谢所有回应的人!对于那些投反对票的人,我不知道你们还想从我这里得到什么

yh2wf1be

yh2wf1be1#

如果可以修改属性声明

你可以在不需要的 prop 上使用[JsonIgnore]属性。

定义忽略 prop 列表

使用这个助手https://github.com/jitbit/JsonIgnoreProps。可以指定要忽略的成员列表。
用它就像

JsonConvert.SerializeObject(
    YourObject,
    new JsonSerializerSettings() {
        ContractResolver = new IgnorePropertiesResolver(new[] { "notImportant1", "notImportant2" })
    };
);

字符串

或使用自定义合约解析器,过滤掉除字段以外的所有内容

注意-我没有测试它,因为现在没有能力,你可能需要调整它

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.Reflection;

public class FieldsOnlyContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);

        // check member types
        if (member.MemberType == MemberTypes.Property)
        {
            property.ShouldSerialize = _ => false; // Ignore all properties
        }

        return property;
    }
}


然后像这样使用它:

var settings = new JsonSerializerSettings
{
    ContractResolver = new FieldsOnlyContractResolver()
};

string json = JsonConvert.SerializeObject(yourObj, settings);

wlsrxk51

wlsrxk512#

我假设问题可能出在你试图保存的数据类型上。
public int count = 0;
在你的例子中,fp应该是原始类型和可序列化的。对存储此信息的对象的相同限制。如果定点数据不能被序列化,那么你应该把它转换成某种可以序列化的类型。例如:

[Serializable]
    public struct ImportantFpData //this is replacement for fp x, fp y
    {
       public int x;
       public int y;
    }

字符串

相关问题