更改以前保存的数组

时间:2018-10-14 09:41:08

标签: c# protobuf-net

在反序列化现有 .proto 文件之前,我需要检查数组属性(HtmlCleanerEngineProfile [])是否已经满足条件。如果没有,那么我应该重新创建该属性。

这是问题所在,在重新构造 HtmlCleanerEngineProfile [] 之后(在构造函数内部),此新属性仍然具有与旧属性相同的值(和长度)。

 [ProtoContract]
 public class HtmlCleanerTemplate : ModelBase
 {
    private string _templateName;
    private int _recursiveLevel = 3;

    [ProtoMember(1)]
    public string TemplateName
    {
        get => _templateName;
        set => SetProperty(ref _templateName, value);
    }

    [ProtoMember(2), DefaultValue(3)]
    public int RecursiveLevel
    {
        get => _recursiveLevel;
        set => SetProperty(ref _recursiveLevel, value);
    }

    // This one..
    [ProtoMember(3, OverwriteList = true)]
    public HtmlCleanerEngineProfile[] EngineProfiles { get; private set; }

    public HtmlCleanerTemplate()
    {
        var engineTypes = RetrieveEngineTypes();
        if (EngineProfiles != null && EngineProfiles.Length == engineTypes.Count) return;

        // 1. Clone existing to restore checked state
        // 2. Recreate HtmlCleanerEngineProfile[]
        var tempProfiles = EngineProfiles?.Clone() as HtmlCleanerEngineProfile[];
        EngineProfiles = new HtmlCleanerEngineProfile[engineTypes.Count];

        for (var i = 0; i < engineTypes.Count; i++)
        {
            EngineProfiles[i] = new HtmlCleanerEngineProfile
            {
                EngineName = engineTypes[i].Name,
                EngineDescription = ReflectionUtils.GetDescription(engineTypes[i]),
            };

            // Restore checked state
            if (tempProfiles != null && i < tempProfiles.Length)
            {
                // Todo: if (EngineProfiles[i].EngineName == tempEngines[i].EngineName)
                    EngineProfiles[i].EngineChecked = tempProfiles[i].EngineChecked;
            }
        }
    }

    private static IList<Type> RetrieveEngineTypes()
    {
        return ReflectionUtils
            .GetTypes("ContentManager.Core.Document.Cleaner")
            .Where(x => typeof(IHtmlCleanerEngine).IsAssignableFrom(x) && x.Name != typeof(IHtmlCleanerEngine).Name)
            .ToList();
    }
}

HtmlCleanerEnglineProfile

    [ProtoContract]
    public sealed class HtmlCleanerEngineProfile
    {
        internal HtmlCleanerEngineProfile() { }

        [ProtoMember(1)]
        public string EngineName { get; set; }

        [ProtoMember(2)]
        public string EngineDescription { get; set; }

        [ProtoMember(3)]
        public bool EngineChecked { get; set; }
    }

我正在尝试创建一个新方法(与构造函数中的代码相同)并分配 [ProtoBeforeDeserialization] 属性。但是我还是得到了相同的结果。我做错什么了吗?

1 个答案:

答案 0 :(得分:0)

通过添加[ProtoAfterDeserialization]属性和[ProtoContract(SkipConstructor = true)]来解决。

[ProtoContract(SkipConstructor = true)]
public class HtmlCleanerTemplate : ModelBase

新方法

[ProtoAfterDeserialization]
protected void AfterDeserialization()
{
   var engineTypes = RetrieveEngineTypes();
   if (EngineProfiles != null && EngineProfiles.Length == engineTypes.Count) return;
   .......
}

Ctor ..

public HtmlCleanerTemplate()
{
   AfterDeserialization();
}
相关问题