关于对象如何序列化和反序列化为字符串的问题,已经解决了:
但是上次是遇到了,去序列化结构体,会出错,所以以为C#中,不支持结构体的序列化呢。
后来无意间得知,C#好像也是能实现结构体的序列化的,所以现在去搞清楚,如何实现。
【解决过程】
1.网上搜了一堆,找到很多谈论关于结构体的padding的,用到StructLayout之类的:
Serialize Struct in Binary, Packed Format
所以也都不是我所想要的答案。
2.后来看到:
C# 结构体 byte[]数组转换
中说,在结构体前面加上Serializable就可以了,但是自己不太清楚如何加。
又接着在
[Serializable]在C#中的作用-NET 中的对象序列化
中看到了,就是结构体前面加上一个[Serializable]即可实现结构体允许序列化。
3.接着就去代码中测试了一下,发现果然是可以的。
这样,就很方便了,就不用我单独的把结构体的每一个域都拆分出来为一个个单独的变量,再每个变量都分别去序列化了。
已实现的相关代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
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]就可以了。