簡體   English   中英

如何防止整個類被序列化?

[英]How to prevent an entire class from being serialized?

我正在使用Newtonsoft.Json來序列化一個類及其所有成員。 有一個特定的類,它的許多成員是一個實例,我只想告訴一個類根本不被序列化,所以如果任何成員是該類型的實例被跳過。

這是否可以在C#中通過將某種屬性附加到類來將其標記為不可序列化?

我不認為這可以使用類上的屬性來完成。 但是,您應該能夠通過實現自定義JsonConverter來實現,該自定義JsonConverter始終將此類的任何實例序列化和反序列化為null 此代碼實現了這樣的行為:

class IgnoringConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteNull();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return null;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(ClassToIgnore);
    }
}

在此示例中, ClassToIgnore是您希望在序列化期間忽略的類。 這些類應該使用JsonConverter屬性進行修飾:

[JsonConverter(typeof(IgnoringConverter))]
class ClassToIgnore

您還可以將轉換器注冊為默認轉換器 ,如果您使用的是ASP.NET Web API,則該轉換器非常有用。

我已經包含一個Console應用程序示例來演示功能:

using System;
using Newtonsoft.Json;

/// <summary>
/// Class we want to serialize.
/// </summary>
class ClassToSerialize
{
    public string MyString { get; set; } = "Hello, serializer!";

    public int MyInt { get; set; } = 9;

    /// <summary>
    /// This will be null after serializing or deserializing.
    /// </summary>
    public ClassToIgnore IgnoredMember { get; set; } = new ClassToIgnore();
}

/// <summary>
/// Ignore instances of this class.
/// </summary>
[JsonConverter(typeof(IgnoringConverter))]
class ClassToIgnore
{
    public string NonSerializedString { get; set; } = "This should not be serialized.";
}

class IgnoringConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteNull();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return null;
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(ClassToIgnore);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var obj = new ClassToSerialize();
        var json = JsonConvert.SerializeObject(obj);

        Console.WriteLine(json);

        obj = JsonConvert.DeserializeObject<ClassToSerialize>(json);

        // note that obj.IgnoredMember == null at this point

        Console.ReadKey();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM