我可以直接序列化struct
类型,因为它是一个值类型。
我在课堂内使用它,但想知道它是否可以单独用于结构。
e.g。
struct student
{
name string; --string is a reference type
age int;
designation string; --string is a reference type
salary double;
};
class foo
{
foo(){
student s;
s.name = "example";
serialize(s);
}
}
This链接说 “我试过让我的struct实现ISerializable,但我无法实现所需的构造函数,因为这是一个结构而不是一个对象。”
答案 0 :(得分:5)
是的,你可以。我刚刚使用以下代码完成了这项工作。
[Serializable]
public struct TestStruct
{
public int Value1 { get; set; }
public int Value2 { get; set; }
public string Value3 { get; set; }
public double Value4 { get; set; }
}
TestStruct s1 = new TestStruct();
s1.Value1 = 43265;
s1.Value2 = 2346;
s1.Value3 = "SE";
string serialized = jss.Serialize(s1);
s2 = jss.Deserialize<TestStruct>(serialized);
Console.WriteLine(serialized);
Console.WriteLine(s2.Value1 + " " + s2.Value2 + " " + s2.Value3 + " " + s2.Value4);
它做了什么?具体应该是什么,序列化和反序列化 struct
。
输出:
{"Value1":43265,"Value2":2346,"Value3":"SE","Value4":5235.3}
43265 2346 SE 5235.3
有趣,这是TestStruct
序列化和反序列化与JSON
的对比。
默认构造函数怎么样? 所有 struct
个对象都有一个默认构造函数,它是struct
对象的基本属性之一,而默认构造函数只负责清除struct
对象所需的内存为默认值。因此,serializer
已经知道有一个默认构造函数,因此可以继续进行,就好像它是一个常规对象(它是)。
此示例使用System.Web.Script.Serialization.JavaScriptSerializer
。
此示例假设struct
中的所有变量都是属性。如果不是,则此答案可能不起作用。 fields
代替properties
似乎对我有用,但这不是最佳做法。您应该始终确保所有对象中的public
变量都是properties
。
答案 1 :(得分:0)
好的,我会让你更容易,这就是我做的事情
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class IClockFingerprintTemplate
{
public ushort Size;
public ushort PIN;
public byte FingerID;
public byte Valid;
[MarshalAs(UnmanagedType.ByValArray)]
public byte[] Template;
}
protected static byte[] RawSerialize(object item, Type anyType)
{
int structSize;
byte[] bff;
IntPtr ptr;
structSize = ((IClockFingerprintTemplate)item).Size;
ptr = Marshal.AllocHGlobal(structSize);
Marshal.StructureToPtr(item, ptr, true);
bff = new byte[structSize];
Marshal.Copy(ptr, bff, 0, 6);
Array.Copy(((IClockFingerprintTemplate)item).Template, 0, bff, 6, structSize - 6);
Marshal.FreeHGlobal(ptr);
}