封装标记为可序列化的原始 C# 类的成员变量

问题描述 投票:0回答:1

我有一个原始的 C# 类,标记为

[Serializable]
。这些字段都是公共的,因为对象是使用 Newtonsoft JSON.NET 保存到文件中的。

[Serializable]
public class PlayerGlobalAggregateData
{
    public int timesPlayed;
    public int timesCleared;
    public int timesFailed;

    public PlayerGlobalAggregateData(int timesPlayed = default,
                                     int timesCleared = default,
                                     int timesFailed = default)
    {
        this.timesPlayed = timesPlayed;
        this.timesCleared = timesCleared;
        this.timesFailed = timesFailed;
    }
}

现在我有一个可编写脚本的对象,其中我有这个类实例作为成员变量:

public class PlayerGlobalAggregateModel : ScriptableObject
{
    private PlayerGlobalAggregateData _data;

    public void SetModelData(PlayerGlobalAggregateData data)
    {
        _data = data;
        //TestCoroutine();
    }

    public PlayerGlobalAggregateData GetPlayerAggregateData()
    {
        //TestCoroutine();
        return _data;
    }
}

执行此类操作背后的想法是,我使用方法

_data 
方法将文件中的所有数据加载到成员变量
SetModelData();
中。在整个游戏过程中,我修改了模型,并在保存回文件时使用
GetPlayerAggregateData()

现在困扰我的是,任何将此可编写脚本的对象作为引用的类都可以访问

_data
字段中的所有数据,甚至可以修改它,因为这些字段在
PlayerGlobalAggregateData
类中都是公共的。

如何更好地封装这些字段?

我不知道该怎么做。

c# unity-game-engine encapsulation mvp serializable
1个回答
0
投票

您可以将字段标记为私有并使用适当的属性进行装饰,例如。

[SerializeField][JsonProperty] private int someDataField; 

然后为每个应该可以从外部访问的变量公开一个 getter 属性,例如。

public int SomeDataField => someDataField;  

这允许在统一检查器中通过

编辑私有字段
[SerializeField]

并允许 JSON.Net 通过

序列化私有字段
[JsonProperty]
© www.soinside.com 2019 - 2024. All rights reserved.