Excluding some properties during serialization without changing the original class

后端 未结 4 1151
走了就别回头了
走了就别回头了 2020-11-29 11:06

I\'m trying to serialize an object with several properties, but I don\'t want to include all properties in the serialization. Also, I would like to change the date format.

4条回答
  •  清歌不尽
    2020-11-29 11:46

    For whoever is interested, I decided to use XmlAttributeOverrides, but made them more strong typed (I hate to type property names as strings). Here is the extension method I used for it:

        public static void Add(this XmlAttributeOverrides overrides, Expression> propertySelector, XmlAttributes attributes)
        {
            overrides.Add(typeof(T), propertySelector.BuildString(), attributes);
        }
    
        public static string BuildString(this Expression propertySelector)
        {
            switch (propertySelector.NodeType)
            {
                case ExpressionType.Lambda:
                    LambdaExpression lambdaExpression = (LambdaExpression)propertySelector;
                    return BuildString(lambdaExpression.Body);
    
                case ExpressionType.Convert:
                case ExpressionType.Quote:
                    UnaryExpression unaryExpression = (UnaryExpression)propertySelector;
                    return BuildString(unaryExpression.Operand);
    
                case ExpressionType.MemberAccess:
    
                    MemberExpression memberExpression = (MemberExpression)propertySelector;
                    MemberInfo propertyInfo = memberExpression.Member;
    
                    if (memberExpression.Expression is ParameterExpression)
                    {
                        return propertyInfo.Name;
                    }
                    else
                    {
                        // we've got a nested property (e.g. MyType.SomeProperty.SomeNestedProperty)
                        return BuildString(memberExpression.Expression) + "." + propertyInfo.Name;
                    }
    
                default:
                    // drop out and throw
                    break;
            }
            throw new InvalidOperationException("Expression must be a member expression: " + propertySelector.ToString());
        }
    

    Then, to ignore an attribute, I can beautifully add it to the ignore list:

        var overrides = new XmlAttributeOverrides();
        var ignore = new XmlAttributes { XmlIgnore = true };
        overrides.Add(m => m.Id, ignore);
        overrides.Add(m => m.DateChanged, ignore);
        Type t = typeof(List);
        XmlSerializer serial = new XmlSerializer(t, overrides);
    

提交回复
热议问题