关于XmlIgnore 与 JsonIgnore的问题

mqmmx 2015-12-24 01:31:16
有一个外部类不可修改 如下


public partial class TestEntity
{
public int ID { get; set; }


public ICollection<string> Names { get; set; }
}


当需要为对类TestEntity进行操作序列化时,因为有Names属性在不可序列化
在外部项目中加入如下代码,跳过Names属性如下


public interface IEnt
{
[XmlIgnore]
[JsonIgnore]
ICollection<string> Names { get; set; }
}

partial class TestEntity : IEnt
{
}

  // xml序列化方法
  public static string SerializeString<T>(T obj)
{
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
XmlSerializer xml = new XmlSerializer(typeof(T));
xml.Serialize(sw, obj);
}

return sb.ToString();
}

// json序列化方法
public static string JsonSerialize<T>(T obj)
{
return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
} 


json 序列化时会跳过Name序列化, 结果没有问题
但XML序列化时会报错.有什么解决方法吗? 还是我写的xml序列化方法错了
...全文
271 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Forty2 2015-12-24
  • 打赏
  • 举报
回复
首先,这个跟序列化的目标格式无关,跟具体使用那个序列化工具类有关。 具体的说,跟是json还是xml无关,跟JsonConvert比较强大,而XmlSerializer比较‘无能’有关。 话说回来,微软类库中的Xml Serialization还是可以自定义的,具体可以使用XmlAttributeOverrides类。
static void Main(string[] args)
{
    var te = new TestEntity() { ID = 5, Names = new string[] { "1", "2" } };

    var overrides = new XmlAttributeOverrides();  // 自定义覆盖
    overrides.Add(typeof(TestEntity), "Names", new XmlAttributes() { XmlIgnore = true });

    string xml = SerializeString(te, overrides);
}

public static string SerializeString<T>(T obj, XmlAttributeOverrides overrides = null)
{
    StringBuilder sb = new StringBuilder();
    using (StringWriter sw = new StringWriter(sb))
    {
        XmlSerializer xml = new XmlSerializer(typeof(T), overrides);
        xml.Serialize(sw, obj);
    }

    return sb.ToString();
}
XmlAttributteOverrides可以参考: https://msdn.microsoft.com/zh-cn/library/system.xml.serialization.xmlattributeoverrides.aspx
mqmmx 2015-12-24
  • 打赏
  • 举报
回复
TestEntity 继承接口 IXmlSerializable 是可以满足我的需求, 但太不方便了,其实如果 能这么写,一点问题也没有了, 主要是TestEntity是不可修改,又要为它指定属性加上XmlIgnoreAttribute json的这么加就行,xml为什么不行呢?

 public partial class TestEntity
    {
        public int ID { get; set; }
 
    [XmlIgnore]
        public ICollection<string> Names { get; set; }
    }
  • 打赏
  • 举报
回复
因为你指定的是接口ICollection<string>,所以序列化失败,哪怕你已经指定了它不要序列化 http://www.cnblogs.com/kissdodog/archive/2013/12/10/3468385.html 可以参考下这个文章里面怎么xml序列化时如何处理接口

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧