110,536
社区成员
发帖
与我相关
我的任务
分享
public struct USER_RECORD
{
public uint nGroupID;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public byte[] szUserID;
public uint nFinger;
public uint nInstances;
public VCOMWrapper.MX00_TEMPLATE_INSTANCE[] instanceRecords;
}
[StructLayout(LayoutKind.Sequential)]
public struct MX00_TEMPLATE_INSTANCE
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2048)]
public byte[] p378Template;
}
public static void Serialize(USER_RECORD rec, string path)
{
using (BinaryWriter wr = new BinaryWriter(File.OpenWrite(path)))
{
Serialize(rec, wr);
wr.Close();
}
}
public static USER_RECORD Deserialize(string path)
{
using (BinaryReader rd = new BinaryReader(File.OpenRead(path)))
{
return Deserialize(rd);
}
}
这边序列化与反序列化只是一个USER_RECORD,如果要序列化List<UserRecord> ps = new List<UserRecord>();和反序列化呢?
public static void Serialize(USER_RECORD rec, string path)
{
using (BinaryWriter wr = new BinaryWriter(File.OpenWrite(path)))
{
Serialize(rec, wr);
}
}
public static USER_RECORD Deserialize(string path)
{
using (BinaryReader rd = new BinaryReader(File.OpenRead(path)))
{
return Deserialize(rd);
}
}
private static void Serialize(USER_RECORD rec, BinaryWriter output)
{
output.Write(rec.nGroupID);
WriteByteArray(rec.szUserID, output);
output.Write(rec.nFinger);
output.Write(rec.nInstances);
if (rec.nInstances > 0)
{
MX00_TEMPLATE_INSTANCE[] array = rec.instanceRecords;
Debug.Assert(array != null && array.Length == rec.nInstances);
for (int i = 0; i < rec.nInstances; i++)
{
MX00_TEMPLATE_INSTANCE inst = array[i];
WriteByteArray(inst.p378Template, output);
}
}
}
private static void WriteByteArray(byte[] data, BinaryWriter output)
{
if (data != null)
{
output.Write(data.Length);
output.Write(data);
}
else
output.Write(-1);
}
private static byte[] ReadByteArray(BinaryReader input)
{
int len = input.ReadInt32();
if (len >= 0)
{
if (len > 0)
return input.ReadBytes(len);
else
return new byte[0];
}
else
return null;
}
private static USER_RECORD Deserialize(BinaryReader input)
{
USER_RECORD rec = new USER_RECORD();
int len;
rec.nGroupID = input.ReadUInt32();
rec.szUserID = ReadByteArray(input);
rec.nFinger = input.ReadUInt32();
len = (int)(rec.nInstances = input.ReadUInt32());
MX00_TEMPLATE_INSTANCE[] array = new MX00_TEMPLATE_INSTANCE[len];
for (int i = 0; i < len; i++)
{
MX00_TEMPLATE_INSTANCE inst = new MX00_TEMPLATE_INSTANCE();
inst.p378Template = ReadByteArray(input);
array[i] = inst;
}
rec.instanceRecords = array;
return rec;
}
public class UserRecord
{
[XmlElement]
private uint nGroupID;
private byte[] szUserID;
private uint nFinger;
private uint nInstance;
private VCOMWrapper.MX00_TEMPLATE_INSTANCE[] instanceRecords;
public UserRecord()
{
}
public UserRecord(uint nGroupID, byte[] szUserID, uint nFinger, uint nInstance, VCOMWrapper.MX00_TEMPLATE_INSTANCE[] instanceRecords)
{
this.nGroupID = nGroupID;
this.szUserID = new byte[32];
Array.Copy(szUserID, this.szUserID, szUserID.Length);
this.nFinger = nFinger;
this.Instance = nInstance;
this.instanceRecords = new VCOMWrapper.MX00_TEMPLATE_INSTANCE[3];
Array.Copy(instanceRecords, this.instanceRecords, instanceRecords.Length);
}
}
调用
List<UserRecord> ps = new List<UserRecord>();
ps.Add(new UserRecord(nGroupID, userRecord.szUserID, userRecord.nFinger, nInstances, instanceRecords));
XmlSerializer ser = new XmlSerializer(typeof(List<UserRecord>));
FileStream fs = File.Create(strFile);
ser.Serialize(fs, ps);
fs.Close();
这样序列化出来的文件如下:
<UserRecord>
<GroupID>5</GroupID>
<Finger>4294967211</Finger>
<Instance>3</Instance>
</UserRecord>
并没有szUserID和instanceRecords, 这是什么问题?