【问题标题】:Best Practice To Handle List Names During Serialization序列化期间处理列表名称的最佳实践
【发布时间】:2014-04-09 18:00:50
【问题描述】:

我有一个对象列表,我通过 WebAPI 返回并从同一个 WebApi 创建。如果它们是另一个类的一部分,那么我可以简单地用 DataContract 装饰它并且一切正常。

public class ParentClass()
{
    [DataContract(Name = "Children", Namespace = "http://schemas.blah.blah"]
    public List<ChildClass> Children
}

当我直接返回一个列表时会出现问题。当我这样做时,我会丢失 DataContract 名称和命名空间。

我可以创建另一个类

[DataContract(Name = "Children", Namespace = "http://schemas.blah.blah"]
public class ChildrenList : List<ChildClass>
{
}

并将我的父类更改为

public class ParentClass()
{
    public ChildrenList Children
}

这解决了问题,但创造了更多。首先是我失去了做事的能力

ChildrenList results = getchildrenlistfromsomemethod();
results = results.OrderByDescending(p => p.Rank).ToList();

我可以用一个纯粹的列表来做。扩展列表也是不好的做法。我可以通过从 Collection 扩展来解决这个问题,但我仍然遇到上述问题,而且我失去了 AddRange() 方法。

我的问题是

1)有没有一种简单的方法可以让某个类型的 List 总是序列化到某个名称和命名空间?

2) 扩展列表是最好的选择,我只是在转换为列表、执行 orderby、groupby 等之间陷入困境......然后将项目重新添加到 foreach 循环中的新扩展列表中。 (似乎很昂贵)

3)我是否错过了一个非常明显且简单的方法来解决这个问题?

【问题讨论】:

    标签: c# list serialization asp.net-web-api


    【解决方案1】:

    尝试使用支持字段声明您的 List:

        [DataContract(Name = "Children", Namespace = @"http://schemas.blah.blah"])
        private ChildClass _children;
    
        public List<ChildClass> Children
        {
            get { return _children; }
            set { _children = value }
        }
    

    【讨论】:

    • 这行不通,因为序列化程序会查看公共字段。即使它确实有效,它在父类中也是完美的,但如果我这样做...... Return new List ... 没有地方可以设置声明。
    猜你喜欢
    • 2013-07-27
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多