什麼我會在代碼解釋...
但它的JIST是我想讀的子類在XML中堅持:廠通過線路發送XML字符串
abstract class Parent {
virtual string ToXml()
{
XmlSerializer xml = XmlSerializer(typeof (this));
...
return xmlString;
}
virtual void FromXml(string rawXml)
{
//either memberwise copy or throw exception if wrong type
...
}
}
sealed class Child1 : Parent
{
[XmlElement("Prop1")]
public Property1 { get; set; }
public Child1() { }
}
sealed class Child2 : Parent
{
[XmlElement("Prop2")]
public Property1 { get; set; }
public Child2() { }
}
static void main()
{
string flatChild1 = new Child1().ToXml();
string flatChild2 = new Child2().ToXml();
// some time goes by
...
Child1 one = new Child1();
Child2 two = new Child2();
one.FromXml(flatChild1); //must be "child one" string or exception
two.FromXml(flatChild2);
//one.FromXml(flatChild2); !! invalid
/*
what i want is some sort of factory...
sealed class MyFactory
{
static Parent MyFactory.FromXml(string xmlObject);
}
*/
Parent obj1 = MyFactory.FromXml(flatChild1);
Parent obj2 = MyFactory.FromXml(flatChild2);
Assert.IsInstanceOfType(obj1, Child1.GetType());
Assert.IsInstanceOfType(obj2, Child2.GetType());
}
* *編輯**
我想發送XML通過線路,所以是這樣的:
// Server.exe Project
server_SendChild1Message()
{
byte[] data = Encoding.UTF16.GetBytes(child1.ToXml());
server.tcpClient[0].write(data, 0, data.Length);
}
// Seperate Client.exe
client_ReadMessages()
{
string s = getNextXmlMessage();
//needs to create a Child1 or Child2 based on xml string
BaseXmlObj b = Factory.objFromXml(s);
}
你試過'[XmlInclude(...)]'?我只想在繼續之前進行檢查... – 2011-05-05 22:07:05
您基本上正在嘗試從您收到的XML創建任何類型;除非通過檢查XML並嘗試解析某個類型然後嘗試將該類型反序列化,否則這注定會失敗。 – Tejs 2011-05-05 22:15:57
不,我沒有想到這一點。我在msdn上查找它,所以我會用XmlInclude(allMyChildTypes)裝飾我的基類?關鍵是我想通過電線發送xml並在另一側重新構建它。 – 2011-05-06 00:14:49