/// <summary>
/// 转换为二进制(只涉及属性字段)
/// </summary>
/// <returns></returns>
public byte[] ToBinary()
{
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
//固定字段
bw.Write(_ID);
bw.Write(_GUID);
bw.Write(_TableName);
//遍历对象属性(代码优先原则)
object obj = this;
PropertyInfo[] pis = obj.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
if (attrs.Length == 1)
{
RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
bw.Write((int)attr.FieldUsage); //写入字段类别
bw.Write(attr.FieldName); //写入字段名
//普通,或者1对1模式
if (attr.FieldUsage == EnumDBFieldUsage.None || attr.FieldUsage == EnumDBFieldUsage.Relationship_O2O)
{
string PropertyTypeName = pi.PropertyType.Name;
if (pi.PropertyType.BaseType.ToString() == "System.Enum")
PropertyTypeName = "System.Enum";
bw.Write(PropertyTypeName); //写入字段类型
switch (PropertyTypeName)
{
case "DateTime":
{
DateTime value = (DateTime)pi.GetValue(obj, null);
//value = DateTime.FromOADate(0.0);
bw.Write(value.ToOADate());
} break;
case "String":
{
string value = (string)pi.GetValue(obj, null);
if (value == null)
value = "";
bw.Write(value);
} break;
case "System.Enum":
{
int value = (int)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Int32":
{
int value = (int)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Double":
{
double value = (double)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Byte[]":
{
byte[] value = (byte[])pi.GetValue(obj, null);
if (value == null)
bw.Write((int)0);
else
{
bw.Write(value.Length);
bw.Write(value);
}
} break;
default: Debug.Assert(false); break;
}
}
//1对多模式
else if (attr.FieldUsage == EnumDBFieldUsage.Relationship_O2M)
{
//遍历所有子对象
IRSFDBRecordCollection rs = this.GetCollection_O2M(attr.FieldName);
//子对象数目
bw.Write(rs.Count);
//子对象数据
for (int n = 0; n < rs.Count; n++)
{
RSFDBObject subObject = rs[n];
byte[] value = subObject.ToBinary();
if (value == null)
bw.Write((int)0);
else
{
bw.Write(value.Length);
bw.Write(value);
}
}
}
}
}
byte[] bytes = ms.ToArray();
bw.Close();
ms.Close();
return bytes;
}
/// <summary>
/// 从二进制中获取(只涉及属性字段)
/// </summary>
/// <returns></returns>
public bool FromBinary(byte[] bytes)
{
MemoryStream ms = new MemoryStream(bytes);
BinaryReader br = new BinaryReader(ms);
//固定字段
_ID = br.ReadInt32();
_GUID = br.ReadString();
string vTableName = br.ReadString();
if (vTableName != _TableName)
{
Debug.Assert(false);
br.Close();
ms.Close();
return false;
}
while (ms.Position < (long)bytes.Length)
{
EnumDBFieldUsage FieldUsage = (EnumDBFieldUsage)br.ReadInt32(); //字段类别
string FieldName = br.ReadString(); //字段名
//普通,或者1对1模式
if (FieldUsage == EnumDBFieldUsage.None || FieldUsage == EnumDBFieldUsage.Relationship_O2O)
{
string PropertyTypeName = br.ReadString(); //字段类型
object value = null;
switch (PropertyTypeName)
{
case "DateTime":
{
value = DateTime.FromOADate(br.ReadDouble());
} break;
case "String":
{
value = br.ReadString();
} break;
case "System.Enum":
{
value = br.ReadInt32();
} break;
case "Int32":
{
value = br.ReadInt32();
} break;
case "Double":
{
value = br.ReadDouble();
} break;
case "Byte[]":
{
int nCount = br.ReadInt32();
if (nCount > 0)
value = br.ReadBytes(nCount);
} break;
default: Debug.Assert(false); break;
}
//遍历对象属性(代码优先原则)
object obj = this;
PropertyInfo[] pis = obj.GetType().GetProperties();
bool IsFind = false;
foreach (PropertyInfo pi in pis)
{
object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
if (attrs.Length == 1)
{
RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
if (attr.FieldName == FieldName)
{
if (PropertyTypeName == "System.Enum")
value = Enum.Parse(pi.PropertyType, value.ToString(), true);
//赋值
pi.SetValue(obj, value, null);
IsFind = true;
break;
}
}
}
Debug.Assert(IsFind == true);
}
//1对多模式
else if (FieldUsage == EnumDBFieldUsage.Relationship_O2M)
{
//遍历所有子对象
IRSFDBRecordCollection rs = this.GetCollection_O2M(FieldName);
IRSFDBRecordCollection2 rs2 = rs as IRSFDBRecordCollection2;
if (rs2 == null)
{
//找huangw
Debug.Assert(false, "需要将rs实现IRSFDBRecordCollection2接口,才能在基类状态下创建元素的实体对象");
}
//子对象数目
int Count = br.ReadInt32();
//子对象数据
for (int n = 0; n < Count; n++)
{
RSFDBObject subObject = rs2.AddObject(); //新对象
int nCount = br.ReadInt32();
if (nCount > 0)
{
byte[] value = br.ReadBytes(nCount);
if (value != null)
subObject.FromBinary(value);
}
}
}
}
br.Close();
ms.Close();
return true;
}
/// 转换为二进制(只涉及属性字段)
/// </summary>
/// <returns></returns>
public byte[] ToBinary()
{
MemoryStream ms = new MemoryStream();
BinaryWriter bw = new BinaryWriter(ms);
//固定字段
bw.Write(_ID);
bw.Write(_GUID);
bw.Write(_TableName);
//遍历对象属性(代码优先原则)
object obj = this;
PropertyInfo[] pis = obj.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
if (attrs.Length == 1)
{
RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
bw.Write((int)attr.FieldUsage); //写入字段类别
bw.Write(attr.FieldName); //写入字段名
//普通,或者1对1模式
if (attr.FieldUsage == EnumDBFieldUsage.None || attr.FieldUsage == EnumDBFieldUsage.Relationship_O2O)
{
string PropertyTypeName = pi.PropertyType.Name;
if (pi.PropertyType.BaseType.ToString() == "System.Enum")
PropertyTypeName = "System.Enum";
bw.Write(PropertyTypeName); //写入字段类型
switch (PropertyTypeName)
{
case "DateTime":
{
DateTime value = (DateTime)pi.GetValue(obj, null);
//value = DateTime.FromOADate(0.0);
bw.Write(value.ToOADate());
} break;
case "String":
{
string value = (string)pi.GetValue(obj, null);
if (value == null)
value = "";
bw.Write(value);
} break;
case "System.Enum":
{
int value = (int)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Int32":
{
int value = (int)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Double":
{
double value = (double)pi.GetValue(obj, null);
bw.Write(value);
} break;
case "Byte[]":
{
byte[] value = (byte[])pi.GetValue(obj, null);
if (value == null)
bw.Write((int)0);
else
{
bw.Write(value.Length);
bw.Write(value);
}
} break;
default: Debug.Assert(false); break;
}
}
//1对多模式
else if (attr.FieldUsage == EnumDBFieldUsage.Relationship_O2M)
{
//遍历所有子对象
IRSFDBRecordCollection rs = this.GetCollection_O2M(attr.FieldName);
//子对象数目
bw.Write(rs.Count);
//子对象数据
for (int n = 0; n < rs.Count; n++)
{
RSFDBObject subObject = rs[n];
byte[] value = subObject.ToBinary();
if (value == null)
bw.Write((int)0);
else
{
bw.Write(value.Length);
bw.Write(value);
}
}
}
}
}
byte[] bytes = ms.ToArray();
bw.Close();
ms.Close();
return bytes;
}
/// <summary>
/// 从二进制中获取(只涉及属性字段)
/// </summary>
/// <returns></returns>
public bool FromBinary(byte[] bytes)
{
MemoryStream ms = new MemoryStream(bytes);
BinaryReader br = new BinaryReader(ms);
//固定字段
_ID = br.ReadInt32();
_GUID = br.ReadString();
string vTableName = br.ReadString();
if (vTableName != _TableName)
{
Debug.Assert(false);
br.Close();
ms.Close();
return false;
}
while (ms.Position < (long)bytes.Length)
{
EnumDBFieldUsage FieldUsage = (EnumDBFieldUsage)br.ReadInt32(); //字段类别
string FieldName = br.ReadString(); //字段名
//普通,或者1对1模式
if (FieldUsage == EnumDBFieldUsage.None || FieldUsage == EnumDBFieldUsage.Relationship_O2O)
{
string PropertyTypeName = br.ReadString(); //字段类型
object value = null;
switch (PropertyTypeName)
{
case "DateTime":
{
value = DateTime.FromOADate(br.ReadDouble());
} break;
case "String":
{
value = br.ReadString();
} break;
case "System.Enum":
{
value = br.ReadInt32();
} break;
case "Int32":
{
value = br.ReadInt32();
} break;
case "Double":
{
value = br.ReadDouble();
} break;
case "Byte[]":
{
int nCount = br.ReadInt32();
if (nCount > 0)
value = br.ReadBytes(nCount);
} break;
default: Debug.Assert(false); break;
}
//遍历对象属性(代码优先原则)
object obj = this;
PropertyInfo[] pis = obj.GetType().GetProperties();
bool IsFind = false;
foreach (PropertyInfo pi in pis)
{
object[] attrs = pi.GetCustomAttributes(typeof(RSFDBFieldAttribute), true);
if (attrs.Length == 1)
{
RSFDBFieldAttribute attr = (RSFDBFieldAttribute)attrs[0];
if (attr.FieldName == FieldName)
{
if (PropertyTypeName == "System.Enum")
value = Enum.Parse(pi.PropertyType, value.ToString(), true);
//赋值
pi.SetValue(obj, value, null);
IsFind = true;
break;
}
}
}
Debug.Assert(IsFind == true);
}
//1对多模式
else if (FieldUsage == EnumDBFieldUsage.Relationship_O2M)
{
//遍历所有子对象
IRSFDBRecordCollection rs = this.GetCollection_O2M(FieldName);
IRSFDBRecordCollection2 rs2 = rs as IRSFDBRecordCollection2;
if (rs2 == null)
{
//找huangw
Debug.Assert(false, "需要将rs实现IRSFDBRecordCollection2接口,才能在基类状态下创建元素的实体对象");
}
//子对象数目
int Count = br.ReadInt32();
//子对象数据
for (int n = 0; n < Count; n++)
{
RSFDBObject subObject = rs2.AddObject(); //新对象
int nCount = br.ReadInt32();
if (nCount > 0)
{
byte[] value = br.ReadBytes(nCount);
if (value != null)
subObject.FromBinary(value);
}
}
}
}
br.Close();
ms.Close();
return true;
}