首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不使用DataContractAttribute的情况下在NetDataContractSerializer中强制排序

在不使用DataContractAttribute的情况下在NetDataContractSerializer中强制排序
EN

Stack Overflow用户
提问于 2018-02-02 01:22:04
回答 1查看 55关注 0票数 0

我想强制NetDataContractSerializer以特定的顺序写入属性值,因为序列化程序按字母顺序写入它们。

我知道我可以通过向这些属性添加[DataMember(Order = X)]属性来实现这一点,但是只有当我将[DataContract]属性添加到我正在序列化的类中时,这才有效。

不幸的是,我不能将[DataContract]属性添加到这个类中,因为它的基类没有这个属性。

有没有其他方法可以强制执行命令?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-02 10:28:36

我想到了使用自己的ISerializationSurrogate的想法,在那里我可以自己处理正在序列化的属性。

代码语言:javascript
复制
private class MySerializationSurrogate<T> : ISerializationSurrogate
{
    private IEnumerable<DataMemberAttribute> GetXmlAttribs(PropertyInfo p) => p.GetCustomAttributes(false).OfType<DataMemberAttribute>();

    public void GetObjectData(Object obj, SerializationInfo info, StreamingContext context)
    {
        var myobj = (T)obj;
        foreach (var property in myobj.GetType().GetProperties().Where(p => GetXmlAttribs(p).Any()).OrderBy(p => GetXmlAttribs(p).First().Order))
        {
            info.AddValue(property.Name, property.GetValue(myobj));
        }
    }

    public Object SetObjectData(Object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
    {
        var myobj = (T)obj;
        foreach (var property in myobj.GetType().GetProperties().Where(p => GetXmlAttribs(p).Any()).OrderBy(p => GetXmlAttribs(p).First().Order))
        {
            property.SetValue(myobj, info.GetValue(property.Name, property.PropertyType));
        }
        return null;
    }
}

然后,我将序列化代理分配给序列化程序。

代码语言:javascript
复制
var formatter = new NetDataContractSerializer();
var surrogateSelector = new SurrogateSelector();
surrogateSelector.AddSurrogate(typeof(T), new StreamingContext(StreamingContextStates.All), new MySerializationSurrogate<T>());
formatter.SurrogateSelector = surrogateSelector;

一切都像地狱一样运转。

请注意,T是被序列化/反序列化的对象的类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48568416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档