C# 如何序列化/反序列化实现IEnumerator、IEnumerable的类?

C# 如何序列化/反序列化实现IEnumerator、IEnumerable的类?,c#,serialization,json.net,ienumerable,ienumerator,C#,Serialization,Json.net,Ienumerable,Ienumerator,我想强调的是,这个问题与为什么使用这种技术和为什么不使用这种技术无关。这与C代码有关 我在下面搜索了一下,但没有找到解决方案 我正在C#中从事WCF Rest项目,该项目将取代.NET远程通信层。我使用Newtonsoft dll进行序列化和反序列化 我有一个名为MyDTO的类,它实现了IEnumerator,IEnumerable,我无法更改,因为这是一个旧类,生产中的许多应用程序都使用它们。当我尝试将MyDTO序列化为字符串时,我没有得到任何错误/异常消息,只得到一个类似“[]”的空数组

我想强调的是,这个问题与为什么使用这种技术和为什么不使用这种技术无关。这与C代码有关

我在下面搜索了一下,但没有找到解决方案

我正在C#中从事WCF Rest项目,该项目将取代.NET远程通信层。我使用Newtonsoft dll进行序列化和反序列化

我有一个名为
MyDTO
的类,它实现了
IEnumerator
IEnumerable
,我无法更改,因为这是一个旧类,生产中的许多应用程序都使用它们。当我尝试将
MyDTO
序列化为字符串时,我没有得到任何错误/异常消息,只得到一个类似“[]”的空数组。有人能告诉我们如何序列化/反序列化实现
IEnumerator
IEnumerable
的类吗

public class MyDTO : IEnumerator, IEnumerable
我正在调用OldServer.dll中名为ABC的方法,该方法为我提供MyDTO对象。我想将其转换为字符串,然后再从字符串转换为MyDTO。

如果你需要更多信息,请告诉我。有关我无法更改的
MyDTO
类,请参见以下内容:

[Serializable]
public class MyDTO : IEnumerator, IEnumerable
{
    #region Inner Types

    internal class MyObjComparer : IComparer<MyObj>
    {
        public int Compare(MyObj x, MyObj y)
        {
            return x.InputCode.CompareTo(y.InputCode);
        }
    }
    #endregion

    #region Variables

    private List<MyObj> myObjList;
    private string selectedObjectMessage;

    private bool containSequenceNo = false;

    private bool sortEnabled;
    private bool filterEnabled;
    private IComparer<MyObj> objectComparer;
    #endregion

    #region Constructors

    public MyDTO()
    {
        this.myObjList = new List<MyObj>();
        this.selectedObjectMessage = string.Empty;
    }

    public MyDTO(List<MyObj> objects)
    {
        this.myObjList = objects;
        this.selectedObjectMessage = string.Empty;
    }

    public MyDTO(IComparer<MyObj> argSortComparer)
        : this()
    {
        this.objectComparer = argSortComparer;
    }

    public MyDTO(List<MyObj> argErrors, IComparer<MyObj> argSortComparer)
        : this(argErrors)
    {
        this.objectComparer = argSortComparer;
    }

    public MyDTO(List<MyObj> argErrors, IComparer<MyObj> argSortComparer, bool argSortEnabled)
        : this(argErrors, argSortComparer)
    {
        this.sortEnabled = argSortEnabled;
    }

    #endregion

    #region Properties

    public string selectedObjectMessage
    {
        get { return this.selectedObjectMessage; }
        set
        {
            if (value == null)
                value = string.Empty;

            this.selectedObjectMessage = value;
        }
    }

    public int Count
    {
        get { return this.myObjList.Count; }
    }

    public bool ErrorsContainsSequenceNo
    {
        get { return this.containSequenceNo; }
        set { this.containSequenceNo = value; }
    }

    public List<MyObj> myObjList            
    {                                          
        get { return this.myObjList; }         
        set { this.myObjList = value; } 
    }     

    public MyDTO WithoutEmptyMyObjects
    {
        get
        {
            MyDTO objs = new MyDTO();

            foreach (MyObj obj in this.myObjList)
            {
                if (!string.IsNullOrEmpty(obj.InputCode))
                    objs.Add(obj);
            }
            return objs;
        }
    }
    #endregion
}
[可序列化]
公共类MyDTO:IEnumerator,IEnumerable
{
#区域内部类型
内部类MyObjComparer:IComparer
{
公共整数比较(MyObj x,MyObj y)
{
返回x.InputCode.CompareTo(y.InputCode);
}
}
#端区
#区域变量
私人名单;
私有字符串selectedObjectMessage;
private bool containSequenceNo=false;
私人住宅被禁止使用;
私人布尔过滤;
私有IComparer对象比较器;
#端区
#区域构造函数
公共MyDTO()
{
this.myObjList=新列表();
this.selectedObjectMessage=string.Empty;
}
公共MyDTO(列出对象)
{
this.myObjList=对象;
this.selectedObjectMessage=string.Empty;
}
公共MyDTO(IComparer argSortComparer)
:此()
{
this.objectComparer=argSortComparer;
}
公共MyDTO(列出argerror、IComparer argSortComparer)
:此(argErrors)
{
this.objectComparer=argSortComparer;
}
公共MyDTO(列出argerror、IComparer argSortComparer、bool argSortEnabled)
:此(argErrors、argSortComparer)
{
this.sortEnabled=argSortEnabled;
}
#端区
#区域属性
公共字符串SelectedObject消息
{
获取{返回this.selectedObjectMessage;}
设置
{
如果(值==null)
value=string.Empty;
this.selectedObjectMessage=值;
}
}
公共整数计数
{
获取{返回this.myObjList.Count;}
}
公共布尔错误ContainsSequenceNo
{
获取{返回this.containSequenceNo;}
设置{this.containSequenceNo=value;}
}
公开名单
{                                          
获取{返回this.myObjList;}
设置{this.myObjList=value;}
}     
公共MyDTO,不包含任何MyyObject
{
得到
{
MyDTO objs=新的MyDTO();
foreach(此.myObjList中的MyObj对象)
{
如果(!string.IsNullOrEmpty(obj.InputCode))
objs.Add(obj);
}
返回对象;
}
}
#端区
}
更新1:

在花了将近一天的时间之后,我们决定编写我们自己的方法,目标是MyDTO,它将生成序列化的XmlDocument。使用相同的XmlDocument,我们将尝试创建MyDTO对象。我觉得我们需要专注于具有setter的属性。我会让你知道的。

使用万能的

1) 创建协定解析程序以根据特定成员的可访问性对其进行序列化/反序列化,因为默认情况下,序列化/反序列化仅对公共成员发生

public class MyContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                        .Select(p => base.CreateProperty(p, memberSerialization))
                    .Union(type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
                               .Select(f => base.CreateProperty(f, memberSerialization)))
                    .ToList();
        props.ForEach(p => { p.Writable = true; p.Readable = true; });
        return props;
    }
}
3) 你可以像这样反序列化

var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };  

MyDTO deserializedDTO = JsonConvert.DeserializeObject<MyDTO>(serializedDTO, settings);
var settings=new JsonSerializerSettings(){ContractResolver=new MyContractResolver()};
MyDTO DeserializedTo=JsonConvert.DeserializeObject(SerializedTo,设置);

谢谢@Mohamed。。我会试着让你们知道。在进一步的分析中,CreateProperties类型是对象。我添加了类型t=类型of(MyDTO);var x=t.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);现在我几乎没有道具了。但是serialize返回我“[]”为什么要使用WCF Rest而不是ASP.NET Web API或ASP.NET Core?在ASP.NET之前,WCF Rest只是一种权宜之计MVC@PanagiotisKanavos.. 在我加入该公司之前,我们决定,为了开放我们的系统,WCF将取代.net远程处理。加入后,我研究了SOAP和REST,并推荐REST。这符合我们的目的我不认为REST HTTP在不久的将来不会被取代你没有回答他的实际问题。勾选Ok。。现在我无法将WCF Rest服务更改为其他服务,因为它已经在生产中。我知道它超出了这个问题的范围,但您可能应该开始计划替换它。WCF可能不会永远存在。。。像这样的升级应该是任何系统生命周期管理的一部分。除非你们计划在它成为ofc的问题之前退役
var settings = new JsonSerializerSettings() { ContractResolver = new MyContractResolver() };  

MyDTO deserializedDTO = JsonConvert.DeserializeObject<MyDTO>(serializedDTO, settings);