簡體   English   中英

序列化列表<object>到字節 [] - c#

[英]Serialize a List<object> to byte[] - c#

正如標題所說,我正在嘗試將 List 序列化為 byte[] 以便能夠通過 zeromq 套接字發送它。

首先,我想要實現的是:從 Windows 事件日志中獲取所有錯誤(來自某些來源)。 然后,把它扔到一個有列表的對象中,然后序列化它並通過 zeromq 套接字發送。

這是我用來存儲信息的兩個類

public class EventErrorList
{
    public int transmiter { get; set; }
    public List<EventEntry> events { get; set; }

}

public class EventEntry
{
    public string msg { get; set; }
    public string source { get; set; }
}

這是我處理錯誤的代碼:

public static void Object(ref NetMQSocket response, string msgResponseCommand)

{

    try
    {
        EventLog myLog = new EventLog();
        myLog.Log = "Application";
        myLog.Source = "Application Error";
        var eventError = new EventErrorList();
        var listError = new List<EventEntry>();
        eventError.transmiter = ManagerDb.GetMachineId();


        for (int index = myLog.Entries.Count - 1; index > 0; index--)
        {
            var errLastEntry = myLog.Entries[index];
            if (errLastEntry.EntryType == EventLogEntryType.Error)
            {
                var appName = errLastEntry;

                if (errLastEntry.Source == ".NET Runtime" || errLastEntry.Source == "MSSQLSERVER" || errLastEntry.Source == "Service1")
                {
                    var entry = new EventEntry();

                    entry.msg = appName.Message;
                    entry.source = appName.Source;

                    listError.Add(entry);

                }

            }



        }
        eventError.events = listError;

        var binFormatter = new BinaryFormatter();
        var mStream = new MemoryStream();
        binFormatter.Serialize(mStream, eventError);

        response.SendFrame(mStream.ToArray());
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error");
        Console.WriteLine(ex.Message);
    }


    }

直到eventError.events = listError; ,代碼效果很好。 但是,從那里開始,它無法正常工作。 我從 SO 中的另一個線程獲得了這種序列化方法,但是在binFormatter.Serialize(mStream, eventError);行中它正在觸發 try/catch,並跳入異常。

這是我得到的例外:

Exception thrown: 'System.Runtime.Serialization.SerializationException' in mscorlib.dll

如果這是一個明顯的問題,我很抱歉,但我並沒有真正用 C# 編寫代碼,而且我一直堅持將此功能添加到現有代碼中。

您需要使用Serializable屬性標記類:

[Serializable]
public class EventErrorList
{
    public int transmiter { get; set; }
    public List<EventEntry> events { get; set; }

}
[Serializable]
public class EventEntry
{
    public string msg { get; set; }
    public string source { get; set; }
}

為了將來參考,您還應該閱讀並發布錯誤消息:

'類型'q48506847.EventErrorList'在程序集'q48506847,版本= 1.0.0.0,文化=中性,PublicKeyToken = null'未標記為可序列化

在此處添加注釋,從 .NET 5.0 開始,由於潛在的安全漏洞,二進制序列化已被棄用。 有關詳細信息,請參閱https://aka.ms/binaryformatter

作為一種解決方法,請使用System.Text.Json.JsonSerializer或 XML 序列化程序。

暫無
暫無

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

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