簡體   English   中英

如何在c#中序列化和反序列化一個以字節數組為成員的類

[英]How to serialize and deserialize a class with byte array as a member in c#

我正在嘗試以字節流的形式在 2 個進程之間發送數據,這對於幾乎所有類都可以正常工作,但我遇到的一個問題是,如果對象的類內部有一個字節數組,則反序列化失敗並給出我的錯誤說明無法加載發生序列化的程序集。 我不能在這里包含程序集,因為發送方和接收方是不同的應用程序。

有沒有辦法來解決這個問題?

編輯:抱歉,事實證明即使是普通的類也無法在另一端反序列化

編輯:2 個應用程序之一使用 .Net 2.0

public static byte[] SerializeToByteArray(this object obj)
{
    if (obj == null)
    {
        return null;
    }
    var bf = new BinaryFormatter();
    using (var ms = new MemoryStream())
    {
        bf.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public static T Deserialize<T>(this byte[] byteArray) where T : class
{
    if (byteArray == null)
    {
        return null;
    }
    using (var memStream = new MemoryStream())
    {
        var binForm = new BinaryFormatter();
        memStream.Write(byteArray, 0, byteArray.Length);
        memStream.Seek(0, SeekOrigin.Begin);s
        var obj = (T)binForm.Deserialize(memStream);
        return obj;
    }
}

我建議你使用DataContractSerializer (這個 MSDN 鏈接也有關於如何用屬性裝飾類的例子)。

然后,您可以輕松地將此類類(反)序列化為二進制形式:

public static byte[] SerializeToByteArray<T>(this T obj) where T : class
{
    if (obj == null)
    {
        return null;
    }
    using (var ms = new MemoryStream())
    {
        var serializer = new DataContractSerializer(typeof(T));
        serializer.WriteObject(ms, obj);
        return ms.ToArray();
    }
}

public static T Deserialize<T>(this byte[] byteArray) where T : class
{
    if (byteArray == null)
    {
        return default(T);
    }
    using (var memStream = new MemoryStream(byteArray))
    {
        var serializer = new DataContractSerializer(typeof (T));
        var obj = (T) serializer.ReadObject(memStream);
        return obj;
    }
}

使用return default(T); 而不是return null; , 因為 T 可能不可為空
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/default

[更新] 警告! 這仍然不是最好的解決方案,因為您必須在兩個應用程序中定義完全相同的類並將它們作為通用參數傳遞給這些函數

[編輯]由於您必須使用 .net 2.0,因此您需要回退到 XMLSerialization。 它不像 DataContract 序列化那么方便,但它應該可以工作。 這是MSDN 上該主題的起始頁下面是序列化/反序列化的代碼

public static byte[] SerializeToByteArray<T>(this T obj) where T : class
{
    if (obj == null)
    {
        return null;
    }
    using (var ms = new MemoryStream())
    {
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(ms, obj);
        return ms.ToArray();
    }
}

public static T Deserialize<T>(this byte[] byteArray) where T : class
{
    if (byteArray == null)
    {
        return null;
    }
    using (var memStream = new MemoryStream(byteArray))
    {
        var serializer = new XmlSerializer(typeof(T));
        var obj = (T)serializer.Deserialize(memStream);
        return obj;
    }
}

暫無
暫無

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

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