如何实现IXmlSerializable,能够直接传对象,而不是像网上大多数方法那样,写两个静态方法服务器端转换成流,把流再拿到客户端转换成对象,100分请教

解决方案 »

  1.   

    Remoting、WS、WCF都可以直接传对象啊,中间的序列化饭序列化过程就不用管了啊
      

  2.   

    我想知道怎么实现IXmlSerializable能直接传对象,这个接口是必须的,目前做的是两个静态方法,只能传string到客户端,然后在反序列化成对象,这样不达要求
      

  3.   

    .net中对象序列化技术浅谈
    本文用比较简短的文字讲述了在.net中序列化化对象的三种方式,然后讲述各种方式之间的区别以及在序列化对象时要注意的一些事项。
      

  4.   

    序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件中“恢复”对象到序列化之前的状态。在网络上不可能直接传递对象,肯定传输的是对象的数据。实现IXmlSerializable接口的原因有两个。第一个原因是要控制 XmlSerializer 对您的对象进行序列化和反序列化的方式。例如,您可以将数据组织成字节,而不用缓冲大型数据集,还可以避免在使用 Base64 编码对数据进行编码时发生膨胀。若要对序列化进行控制,请实现 ReadXml 和 WriteXml 方法来控制用于读写 XML 的 XmlReader 和 XmlWriter 类。第二个原因是要能对架构进行控制。为此,您必须将 XmlSchemaProviderAttribute 应用于可序列化的类型,并指定返回架构的静态成员的名称。
      

  5.   

    文章确实是好文,有空会看的,不过明确说了不要静态方法两边转,要实现IXmlSerializable接口
      

  6.   

    贴段代码,ReadXml方法中反序列化时reader是有值的,但是得到的对象却是null        public void ReadXml(System.Xml.XmlReader reader)
            {
                reader.ReadStartElement();        
                  reader.Read();
                XmlSerializer itemSerializer = new XmlSerializer(typeof(MyType));
                //反序列化
                Object obj = itemSerializer.Deserialize(reader);
                while (obj != null)
                {
                    this.m_list.Add(obj as Data);
                      obj = itemSerializer.Deserialize(reader);
                }
                reader.ReadEndElement();
            }        public void WriteXml(System.Xml.XmlWriter writer)
            {
                writer.WriteStartElement(MyType.FullName);
                XmlSerializer xs = new XmlSerializer(MyType);
                foreach (Data d in this.m_list)
                {
                    //序列化
                    xs.Serialize(writer, d);
                }
                writer.WriteEndElement();
            }
      

  7.   

    我晕,能这样我还问啥
    就是说我WebService里写的方法返回的就是我需要的对象,在前台不做任何处理
      

  8.   

    需要被传的对象实现Serializable接口,由于 HttpServletResponse 只能发送 byte[],因此需要将对象转化成字节数组,然后发送。//Server端:sendObjectResponse( HttpServletResponse response )   
    {
                response.setContentType("application/octet-stream");
                OutputStream out = response.getOutputStream();            ByteArrayOutputStream bout = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(bout);
                oos.writeObject(responseObject);
                oos.flush();
                byte[] byteArry = bout.toByteArray();
                bout.close();
                oos.close();
                
                out.write(byteArry);
                out.flush();} 
    //Client端receiveObjectResponse( )
    {
                HttpClient client = new HttpClient();             String url = "http:////localhost:9080/test";
                PostMethod postMethod = new PostMethod( url );             client.executeMethod( postMethod );             InputStream bin = postMethod.getResponseBodyAsStream();
                ObjectInputStream ois = new ObjectInputStream(bin);                                   // get the Object
                result = ois.readObject();
                  
                bin.close();
                ois.close();             // close the post connection
                postMethod.releaseConnection();}
      

  9.   

    你就是想在那个实现了IXmlSerializable的类的ReadXml把对象反序列化后放到一个list中,是吧?
      

  10.   

    基本是这个意思,刚才查了一下,好像我的自定义类实现了IXmlSerializable接口就能在服务器作为对象返回了,但是具体怎么实现这个接口的方法很头疼
      

  11.   

    刚才同事试了一下,在同一个命名空间下,webservice能够返回自定义类的对象,但是分开就不能了
      

  12.   

    [Quote=引用 10 楼 lovelan1748 的回复:
     我晕,能这样我还问啥
     就是说我WebService里写的方法返回的就是我需要的对象,在前台不做任何处理
    [/Quote]
    这,还不是我在1楼说的那样的吗?
    [WebMethod]
    public MyData MyMethod(......)
    客户端调用MyMethod,就可以直接得到MyData,是吗?
      

  13.   

    把那个类写在一个dll里,服务端和客户端的project,都引用这个dll,就可以了。
      

  14.   

    那个类要用[Serializable]标记
    [Serializable()]
    public class TestSimpleObject  {    public int member1;
        public string member2;
        public string member3;
        public double member4;    // A field that is not serialized.
        [NonSerialized()] 
        public string member5;     public TestSimpleObject() {        member1 = 11;
            member2 = "hello";
            member3 = "hello";
            member4 = 3.14159265;
            member5 = "hello world!";
        }
      

  15.   

    标了,据同事说好像和webservice在一个解决方案里面就能得到,分开就不行了,郁闷了
      

  16.   

    怎么会呢?我们一直这么做的,即使不在一个解决方案里也可以用的。
    客户端也可以不引用那个类的dll,只要添加web引用,引用那个服务,就可以自动生成客户端用的类,包括那个实体类。
      

  17.   


     [Serializable]
        public class abstractAB : abstractA ,IXmlSerializable
        {        public string test = "123123"; 
            public override string GetStirng()
            {
                return "";
            }        public abstractAB() { }        #region IXmlSerializable 成员        public System.Xml.Schema.XmlSchema GetSchema()
            {
                throw new NotImplementedException();
            }        public void ReadXml(XmlReader reader)
            {
                reader.Read();
                reader.ReadStartElement();
                reader.ReadAttributeValue();
                test = reader.Value;
                reader.Read();
                reader.ReadEndElement();
            }        public void WriteXml(XmlWriter writer)
            {
                writer.WriteStartElement("abstractAB");
                writer.WriteStartAttribute("ClassName");
                writer.WriteValue("abstractAB");
                writer.WriteEndAttribute();
                writer.WriteValue(test);
                writer.WriteEndElement();
            }        #endregion
        }
    简单的写了一下IXmlSerializable接口
    WriteXml就是自己组装xml。
    ReadXml 就是自己解析xml,还原
      

  18.   

    mbh0210 请看看我9#的实现代码
      

  19.   

    你要吧 XmlSerializer itemSerializer = new XmlSerializer(typeof(MyType));这个放在外面去反序列化也是要根据你的类调用ReadXml()方法加载数据。
      

  20.   

    IXmlSerializable接口主要是自定义序列化之后的xml架构