当前位置:  开发笔记 > 编程语言 > 正文

通过Web服务在自定义对象中序列化名称/值对

如何解决《通过Web服务在自定义对象中序列化名称/值对》经验,为你挑选了1个好方法。

这是一个非常复杂的问题,涉及如何在数据不是强类型时通过Web服务调用序列化数据.我会尝试尽可能地将它列出来.

样本存储对象:

[Serializable]
public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List OtherInfo { get; set; }  
}
[Serializable]   
public class NameValuePairs {
  public string Name { get; set; }
  public string Value { get; set; }
}

样品使用:

[WebMethod]
    public List GetStorageObjects() {
      List o = new List() {
        new StorageObject() { 
          Name = "Matthew",
          Birthday = "Jan 1st, 2008", 
          OtherInfo = new List() {
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        },
        new StorageObject() { 
          Name = "Joe",
          Birthday = "Jan 10th, 2008",
          OtherInfo = new List() { 
            new NameValuePairs() { Name = "Hobbies", Value = "Programming" },
            new NameValuePairs() { Name = "Website", Value = "Stackoverflow.com" }
          }
        }
      };

      return o;
    }

Web服务的返回值:


    Matthew
    Jan 1st, 2008
    
        
            Hobbies
            Programming
        
        
            Website
            Stackoverflow.com
        
    

我想要的是:


    Programming
    Stackoverflow.com

原因和其他东西:

首先,我很抱歉帖子的长度,但我也希望提供可重现的代码.

我希望它采用这种格式,因为我正在使用PHP的Web服务.我想轻松一下:

//这是重要的

In PHP => "$Result["StorageObject"]["OtherInfo"]["Hobbies"]".  

如果它是另一种格式,那么根本就没有办法实现这一点.另外,在C#中,如果我正在使用该服务,我还希望能够执行以下操作:

//这是重要的

In C# => var m = ServiceResult[0].OtherInfo["Hobbies"];

不幸的是,我不知道如何做到这一点.通过构建一个实现IXmlSerializer的自定义Dictionary(参见StackOverflow:IXmlSerializer Dictionary),我能够以这种方式实现它,但是,它将WSDL模式从水中吹走了.它也太复杂了,在我的WinFormsTester应用程序中产生了可怕的结果!

有没有办法实现这个目标?我需要创建什么类型的对象?有没有办法做这个/除了通过制作一个强类型的集合/?显然,如果我强力输入如下:

public class OtherInfo {
  public string Hobbies { get; set; }
  public string FavoriteWebsite { get; set; }
}

然后它将完美地工作,我将没有WSDL问题,我将能够从PHP和C#(.OtherInfo.Hobbies)轻松访问它.

但是,我会完全失去NVP的观点,因为我必须提前知道列表是什么,并且它将是不可更改的......比如说,来自数据库.

感谢大家!!我希望我们能够为此提出某种解决方案.这是再次要求:

    WSDL架构不应该破坏

    名称值对(NVP)应序列化为属性格式

    应该可以通过名称["爱好"]轻松访问PHP中的NVP

    应该很容易在C#中访问(并与它的代理生成器兼容)

    易于序列化

    不要求我强烈输入数据

现在,我/完全/开放输入更好/不同的方式来做到这一点.我正在存储一些相对"静态"的信息(如Name)和一堆数据.如果有更好的方式,我很乐意听到它.



1> Ray Lu..:

这就像对象的动态属性.与javascript不同,C#不是一种动态语言,或者PHP可以动态解析对象属性.我能想到以下两种方法.第二个可能符合您的要求.

KISS方式

保持简单愚蠢的方式

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public List OtherInfo { get; set; }  
}

您可以使用以"|"分隔的名称值对

OtherInfo = {"Hobbies|Programming", "Website|Stackoverflow.com"}

序列化表格


    Matthew
    Jan 1st, 2008
    
        Hobbies|Programming
        Website|Stackoverflow.com
    

C#中的动态方式

使名称值对部分成为XML元素,以便您可以动态构建它.

public class StorageObject {
  public string Name { get; set; }
  public string Birthday { get; set; }
  public XElement OtherInfo { get; set; } // XmlElement for dot net 2
}

您可以轻松地将OtherInfo对象构建为以元素为中心的例如

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..Hobbies xelement & text value..);
OtherInfo.Add( ..WebSite xelement & text value..);

序列化的表格将是


    Programming
    Stackoverflow.com

或者将其构建为以属性为中心

XElement OtherInfo = new XElement("OtherInfo");
OtherInfo.Add( ..nvp xattribute Hobbies & value..);
OtherInfo.Add( ..nvp xattribute WebSite & value..);


    
    

对于任何动态语言,它都可以直接访问属性.对于其他人,他们可以通过读取XML来访问该值.阅读XML得到了大多数框架的支持.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有