【问题标题】:Serialization issue Dictionary<string,object> - Alternate design options?序列化问题 Dictionary<string,object> - 替代设计选项?
【发布时间】:2011-03-02 03:22:43
【问题描述】:

我需要向 wcf 休息服务 (4.0) 发出发布请求。该服务将从客户端应用程序(jquery)和服务器端应用程序(asp.net 等)调用。 该服务公开一个持久存储并提供 CRUD 操作。

我对序列化有疑问。

我看了几篇与此相关的文章-> http://blogs.msdn.com/b/youssefm/archive/2009/04/21/understanding-known-types.aspx

public class CustomType
{
    public Dictionary<string,object> CustomObjectCollection {get; set;}
     public SavedBy {get; set;}     
     public SavedOn {get; set;}     


    public CustomType()
    {
        CustomObjectCollection = new Dictionary<string,object>();
    }
}


public class State1
{
    public prop1 {get; set;}
    public prop2 {get; set;}
}

public class State2
{
    public prop1 {get; set;}
    public prop2 {get; set;}
}

客户端使用 WCF:

public void save()
{
    CustomType req = new CustomType();
    req.CustomObjectCollection("State1", new State1() {prop1 = val1, prop2 = val2 } ); 
        req.CustomObjectCollection("State2", new State2() {prop1 = val3, prop2 = val4 } ); 

    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(CustomType));
        MemoryStream ms = new MemoryStream();
        serializer.WriteObject(ms, setting);

        string json = Encoding.Default.GetString(ms.ToArray());
        ms.Close();

    Utility.HTTPRequest("http://localhost:2222/MyWCFRestSVC/save", "post", json);

}

WCF 方法:

public bool Save(CustomType req)
{
 /////////
}

我可能无法使用“已知类型”解决方法,因为使用此服务的每个客户端都将使用其自己的自定义类型。理想情况下,服务不应该担心客户想要保留的类型。请注意,该服务公开了一个仅保存通用状态信息的持久性存储。

我尝试使用 Dictionary 而不是 Dictionary 我将 json 字符串表示 os State1 和 State2 存储为值。我遇到的问题是,当我使用 DataContractJsonSerializer 序列化 CustomType 实例时,State1 和 State2 的 json 字符串嵌入了反斜杠(转义字符),我猜是因为双重序列化?

我有关于自定义序列化而不是 DataContractJsonSerializer 的想法。

请告诉我你的想法。

感谢您的宝贵时间。

【问题讨论】:

    标签: c# wcf json serialization rest


    【解决方案1】:

    由于服务显然没有以预期的方式使用字典,也许您应该查看不同的数据结构?

    我所说的“以某种预期的方式”是指快速查找。那是一个哈希表。您只是将一堆信息收集到其中,只是为了将其推送到您的客户端应用程序。所以你需要的是

    List<string, List<object>>
    

    还要确保您的“对象”也是可序列化的。

    【讨论】:

    • 谢谢。我不认为它与字典有任何关系。即使我有这个属性:`public object State {get;set;}',当我使用 State1 类型设置 State 属性时,如果不指定“已知类型”,我将无法使用 DataContractJsonSerializer,因为它不知道类型要序列化的信息。有什么想法吗?
    【解决方案2】:

    不久前我问了一个类似的问题。没有直接的答案,但我们想出了一个解决方法:

    Serializing IDictionary<string, object> in WCF

    【讨论】:

    • 谢谢,您介意提供有关如何将 Dictionary 替换为 Dictionary 的更多详细信息。另外,请参阅我对 Shiv 回答的回复。
    • 我添加了另一个与此相关的帖子:stackoverflow.com/questions/5171925/…
    • 我认为你打错了 - 我们放置了 Dictionary Dictionary。我们的对象都是基本类型(字符串、整数、日期时间、字符串 [] 等)。字符串 [] 对象导致了问题。所以我们实现了一些简单的自定义序列化,对于大多数类型基本上调用 ToString(),对于 string[](这对我们来说是个问题),我们提出了自定义字符串表示。
    • 谢谢,是的,我的意思是 Dictionary 到 Dictionary。我可能需要处理更多的自定义类型,例如来自第三方控件的类等。所以可能有点棘手。
    【解决方案3】:

    当我过去需要通过 WCF/Web 服务传输 Dictionary 时,我通常从 Dictionary 子类化,然后实现 IXmlSerializable 接口 - 即 ReadXml()、WriteXml()

    这允许通过线路控制消息的格式,如果您知道要传输的数据类型,则可以产生更有效的序列化方法。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多