Json.net和JsonIgnore在序列化

时间:2013-08-08 13:43:36

标签: c# json.net signalr

我有一个具有Seri​​alizable属性的对象,该类继承自从其他类继承的抽象类,该类也继承自接口

我用过

 string included = JsonConvert.SerializeObject(msg,
                              Formatting.Indented,
                              new JsonSerializerSettings { /*ContractResolver = new NotificationPropertyResolver()*/ TypeNameHandling  = TypeNameHandling.All});

因为msg是界面 我想在SignalR中发送这个对象,我发现它不会忽略任何成员, 我已经装饰了界面和类

有解决方案吗? 我也尝试过使用具有自己属性的解析器 - 但结果仍然相同

班级很大但是......

 [Serializable]
[WebAPINotification(Type = typeof(CSensor), Group = "Sensor")]
public class SensorsStateModeNotification : SensorNotification, IBPMPackagedNotification

public abstract class SensorNotification : BasicLanNotification, ISensNotification

[Serializable]
public class BasicLanNotification : BasicNotification, ILanNotification

[Serializable]
public abstract class BasicNotification : INotification, ISerializable, IOpSerializable

[JsonIgnore]
    public long SentAt 
    {
        get
        {
            return m_sentAt;
        }
        set
        {
            m_sentAt = value;
        }
    }

    /// <summary>
    /// 
    /// </summary>
    [JsonIgnore]
    public ENotificationGateway NotificationGateway
    {
        get
        {
            return m_NotifyGateway;
        }
        set
        {
            m_NotifyGateway = value;
        }
    }

2 个答案:

答案 0 :(得分:0)

您的类型实现ISerializable接口 - 优先于属性。如果您不想序列化该类的成员,只需在ISerializable.GetObjectData实现中不返回它们。请参阅下面的SSCCE(顺便提一下,如果您想要更好的答案,将来还应该提供一个答案)。

public class StackOverflow_18127665
{
    public class WebAPINotificationAttribute : Attribute
    {
        public Type Type { get; set; }
        public string Group { get; set; }
    }
    public class CSensor { }
    public interface INotification { }
    public interface IOpSerializable { }
    public interface IBPMPackagedNotification { }
    public interface ILanNotification { }
    public interface ISensNotification { }
    [Serializable]
    [WebAPINotification(Type = typeof(CSensor), Group = "Sensor")]
    public class SensorsStateModeNotification : SensorNotification, IBPMPackagedNotification { }

    public abstract class SensorNotification : BasicLanNotification, ISensNotification { }

    [Serializable]
    public class BasicLanNotification : BasicNotification, ILanNotification { }

    [Serializable]
    public abstract class BasicNotification : INotification, ISerializable, IOpSerializable
    {
        long m_sentAt;
        ENotificationGateway m_NotifyGateway;
        [JsonIgnore]
        public long SentAt
        {
            get
            {
                return m_sentAt;
            }
            set
            {
                m_sentAt = value;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonIgnore]
        public ENotificationGateway NotificationGateway
        {
            get
            {
                return m_NotifyGateway;
            }
            set
            {
                m_NotifyGateway = value;
            }
        }

        #region ISerializable Members

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            // Comment the lines below not to have this serialized
            info.AddValue("NotificationGateway", this.NotificationGateway);
            info.AddValue("SentAt", this.SentAt);
        }

        #endregion
    }
    public enum ENotificationGateway { First, Second }
    public static void Test()
    {
        BasicNotification msg = new BasicLanNotification
        {
            SentAt = 123,
            NotificationGateway = ENotificationGateway.First
        };
        var str = JsonConvert.SerializeObject(
            msg,
            Newtonsoft.Json.Formatting.Indented,
            new JsonSerializerSettings
            {
                TypeNameHandling = TypeNameHandling.All
            });
        Console.WriteLine(str);
    }
}

答案 1 :(得分:0)

public class NotificationPropertyResolver : DefaultContractResolver
    {
        public NotificationPropertyResolver()
        {
            IgnoreSerializableAttribute = true;
            IgnoreSerializableInterface = true;
        }

    }