我有一個奇怪的問題,很困惑。我想通過電線發送數據集並對其進行序列化。當我反序列化時,我想檢索對象和它的屬性。但是,當我DESERIALIZE(EDITED)時,它似乎失去了與基類相關的子類。我創建了以下類:反序列化時丟失對象
[Serializable]
public class DataAttributeColumn : DataColumn, ISerializable
{
private string attributeName;
[DataMember(IsRequired = true)]
public string AttributeName
{
get { return attributeName; }
set { attributeName = value; }
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("AttributeName", this.AttributeName);
}
}
而不是使用列名的DataColumn的,我想擴展它的添加屬性名稱。這一切都工作100%,直到我通過電線發送。
我創建了以下Test類並使用了Binary和DataContract序列化程序。
public class Test
{
DataSet ds = new DataSet();
DataTable dt = new DataTable();
DataAttributeColumn dac = new DataAttributeColumn();
public void CreateData()
{
ds.Tables.Add(dt);
dac.AttributeName = "MyAttribute";
dt.Columns.Add(dac);
}
public void SerializeBinary()
{
DataSet dss = new DataSet();
BinaryFormatter dcs = new BinaryFormatter();
ds.RemotingFormat = SerializationFormat.Xml;
string strTempfilePath = "binary.txt";
FileStream fs;
using (fs = new FileStream(strTempfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
dcs.Serialize(fs, ds);
}
fs = new FileStream(strTempfilePath, FileMode.Open);
dss = dcs.Deserialize(fs) as DataSet;
DataAttributeColumn dac2 = null;
dac2 = dss.Tables[0].Columns[0] as DataAttributeColumn;
if (dac2 != null)
{
Console.WriteLine("YOU DID IT!!!!");
}
//Second Serialize
using (fs = new FileStream("binary2.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
dcs.Serialize(fs, dss);
}
}
public void SerializeDataContract()
{
DataSet dss = new DataSet();
Type[] knowntypes = { typeof(DataAttributeColumn), typeof(DataColumn) };
DataContractSerializer dcs = new DataContractSerializer(typeof(DataSet), knowntypes);
MemoryStream stream = new MemoryStream();
ds.RemotingFormat = SerializationFormat.Xml;
string strTempfilePath = "datacontract.txt";
FileStream fs;
using (fs = new FileStream(strTempfilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
dcs.WriteObject(fs, ds);
}
fs = new FileStream(strTempfilePath, FileMode.Open);
dss = dcs.ReadObject(fs) as DataSet;
DataAttributeColumn dac2 = null;
dac2 = dss.Tables[0].Columns[0] as DataAttributeColumn;
if (dac2 != null)
{
Console.WriteLine("YOU DID IT!!!!");
}
using (fs = new FileStream("datacontract2.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
dcs.WriteObject(fs, dss);
}
}
}
我的目標是創建一個屬性,當我反序列化,我可以從DataColumn中投的對象放回DataAttributeColumn,以獲取「的AttributeName」。
我該怎麼做到這一點?
編輯:反序列化後serializatiion
<DataSet><xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="Table1"><xs:complexType><xs:sequence><xs:element name="Column1" msdata:**AttributeName="MyAttribute"** type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"/></DataSet>
和輸出後的輸出:
<DataSet><xs:schema id="NewDataSet" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"><xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"><xs:complexType><xs:choice minOccurs="0" maxOccurs="unbounded"><xs:element name="Table1"><xs:complexType><xs:sequence><xs:element name="Column1" type="xs:string" minOccurs="0"/></xs:sequence></xs:complexType></xs:element></xs:choice></xs:complexType></xs:element></xs:schema><diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"/></DataSet>
很難使這個問題的意義。屬性與類型相關聯。你序列化一個對象,而不是一個類型。 –
讓我們這樣,在序列化後,我怎樣才能確保何時我將「dac2 = dss.Tables [0] .Columns [0]」作爲DataAttributeColumn;「。我可以在反序列化之後檢索「dac2.AttributeName」。 – Mage