{
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;
}
List<USER_RECORD> ps = new List<USER_RECORD>();
现在要把ps保存成文件,并且下次文件能正确解析出ps?
如果结构体USER_RECORD没有instanceRecords,就可以把这个结构体转成Byte[], 然后写到文件,解析时,读取文件byte[]转成结构体,可是现在有VCOMWrapper.MX00_TEMPLATE_INSTANCE[], 结构体转成Byte[]失败.
http://msdn.microsoft.com/zh-cn/library/c5sbs8z9(v=vs.110).aspx
—-
不然以前也是用这个
—-
自定义FromXml-ToXml可以?
—- 10分
—-
没有BinaryFormatter也不复杂,可以自己定义一个格式,然后用BinaryWriter和BinaryReader来实现序列化。
—-
定义类
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, 这是什么问题?
—- 90分
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 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>();和反序列化呢?
—-
非常感谢你为我写了这么多!这边序列化与反序列化只是一个USER_RECORD,如果要序列化List<UserRecord> ps = new List<UserRecord>();和反序列化呢?
—-
—-
楼主的实现方案 有这么 几点:
>自己手写 正反序列化(自己 分析 字符串 或 字节流 —— 不建议)
>序列化成 XML;
>使用 AsGoodAsItGets.Ser*****.dll 这个 第三方的 字节流序列化(支持 WinCE)
>使用 http://www.shuxiaolong.com/Project/0/5I7UG4C8GQB.aspx 这个算法 能支持 WinCE 的 字节流 正反序列化。
好吧,我承认 我打了个 广告,斑竹 见谅。
—-
Laura.Serialization 支持 PC 和 WinCE 的 字节流正反序列化 —— 被 五六个 大项目 所考验过。
http://www.shuxiaolong.com/Project/0/5IB56RCWWHE.aspx
—-
我只是抛个砖,剩下这部分代码我想你自己也能够写。List<UserRecord>无非是多几个UserRecord对象,可以按照数组的办法来进行序列化和反序列化,你读懂了我的代码自然就可以写出来了。
—-
非常感谢你,自己写了List,可以了,再一次谢谢!
—-
1.序列化和反序列化;
2.转成json串保存;