簡體   English   中英

如何序列化/反序列化實現IEnumerator,IEnumerable的類?

[英]How to serialize/deserialze a class that implements IEnumerator, IEnumerable?

只是想強調這個問題與為什么使用這項技術以及為什么不這樣做無關。 這與C#代碼有關。

我在下面搜索,但沒有提供解決方案。

序列化實現IEnumerable的類

實現IEnumerator的類的序列化

我正在使用C#中的WCF Rest項目進行工作,該項目正在替換.NET Remoting通信層。 我使用Newtonsoft dll進行序列化和反序列化。

我有一個名為MyDTO的類,該類實現了IEnumeratorIEnumerable ,我不能更改它,因為這是舊類,並且生產中的許多應用程序都使用它們。 當我嘗試將MyDTO序列化為字符串時,我沒有收到任何錯誤/異常消息,只是得到了一個空數組,例如“ []”。 誰能告訴我們如何序列化/反序列化實現IEnumeratorIEnumerable

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
}

更新1:

花了將近一天的時間之后,我們決定編寫自己的針對MyDTO的方法,該方法將生成要序列化的XmlDocument。 使用相同的XmlDocument,我們將嘗試創建MyDTO對象。 我覺得我們只需要專注於具有二傳手的屬性。 我會讓你知道。

使用萬能的Json.Net

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;
    }
}

2)然后您可以像序列化對象

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

// dtoInstance is your dto instance you wish to serialize.
string serializedDTO = JsonConvert.SerializeObject(dtoInstance, settings);

3)你可以反序列化像

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM