工厂通过电线发送xml字符串

时间:2011-05-05 22:00:02

标签: c# xml xml-serialization factory xmlserializer

我想要的是在代码中解释...
但它的主旨是我想要读取持久存在于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);
}

1 个答案:

答案 0 :(得分:0)

泛型。这是否适用于您想要做的事情?

如果您试图避免指定要反序列化的对象的类型,则不能;它确定用于反序列化对象的代码。

abstract class Parent<T> where T : Parent<T> {
    virtual string ToXml()
    {
        XmlSerializer xml = XmlSerializer( typeof (T) );
        ...
        return xmlString;
    }

    virtual void FromXml(string rawXml)
    {
        //either memberwise copy or throw exception if wrong type
        ...
    }
}

sealed class Child1 : Parent<Child1>
{
    [XmlElement("Prop1")] 
    public Property1 { get; set; }

    public Child1() { }
}

sealed class Child2 : Parent<Child1>
{
    [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<T>
      {
         static T MyFactory.FromXml(string xmlObject);
      }

    */
    Child1 obj1 = MyFactory<Child1>.FromXml(flatChild1);
    Child2 obj2 = MyFactory<Child2>.FromXml(flatChild2);

    Assert.IsInstanceOfType(obj1, Child1.GetType());
    Assert.IsInstanceOfType(obj2, Child2.GetType());
}