最新消息:20210917 已从crifan.com换到crifan.org

【已解决】C#结构体Struct的序列化Serialize和反序列化unserialize为字符串

C# crifan 7890浏览 0评论

关于对象如何序列化和反序列化为字符串的问题,已经解决了:

但是上次是遇到了,去序列化结构体,会出错,所以以为C#中,不支持结构体的序列化呢。
后来无意间得知,C#好像也是能实现结构体的序列化的,所以现在去搞清楚,如何实现。

【解决过程】
1.网上搜了一堆,找到很多谈论关于结构体的padding的,用到StructLayout之类的:
Serialize Struct in Binary, Packed Format
所以也都不是我所想要的答案。

2.后来看到:
C# 结构体 byte[]数组转换
中说,在结构体前面加上Serializable就可以了,但是自己不太清楚如何加。

又接着在
[Serializable]在C#中的作用-NET 中的对象序列化
中看到了,就是结构体前面加上一个[Serializable]即可实现结构体允许序列化。

3.接着就去代码中测试了一下,发现果然是可以的。
这样,就很方便了,就不用我单独的把结构体的每一个域都拆分出来为一个个单独的变量,再每个变量都分别去序列化了。
已实现的相关代码如下:

public bool serializeObjToStr(Object obj, out string serializedStr)
{
    bool serializeOk = false;
    serializedStr = "";
    try
    {
        MemoryStream memoryStream = new MemoryStream();
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        binaryFormatter.Serialize(memoryStream, obj);
        serializedStr = System.Convert.ToBase64String(memoryStream.ToArray());

        serializeOk = true;
    }
    catch
    {
        serializeOk = false; 
    }

    return serializeOk;
}

public bool deserializeStrToObj(string serializedStr, out object deserializedObj)
{
    bool deserializeOk = false;
    deserializedObj = null;

    try
    {
        byte[] restoredBytes = System.Convert.FromBase64String(serializedStr);
        MemoryStream restoredMemoryStream = new MemoryStream(restoredBytes);
        BinaryFormatter binaryFormatter = new BinaryFormatter();
        deserializedObj = binaryFormatter.Deserialize(restoredMemoryStream);

        deserializeOk = true;
    }
    catch
    {
        deserializeOk = false;
    }

    return deserializeOk;
}

        
[Serializable]
public struct loginInfo_t
{
    public bool valid;
    public string username;
    public string cid;
    public string appid;
    public string bitProtocol;
    public string canary;
    public CookieCollection cookies;
};
        
string serializedStr = "";
if(serializeObjToStr(loginInfo, out serializedStr))
{
    Settings.Default.loginInfoStr = serializedStr;
    Settings.Default.Save();
}

【总结】

C#中,是可以实现结构体的序列化的,方法很简单,就是结构体前面加上一个[Serializable]就可以了。

转载请注明:在路上 » 【已解决】C#结构体Struct的序列化Serialize和反序列化unserialize为字符串

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (1)

  1. 谁告诉你的。你用Serializable这个序列化,不同进程之间,不玩了???第一次听说struct的序列化用Serializable
    penguin_ku10年前 (2014-04-17)回复
95 queries in 0.219 seconds, using 23.28MB memory