【问题标题】:Deserializing C++ string in WCF service using Json converter使用 Json 转换器反序列化 WCF 服务中的 C++ 字符串
【发布时间】:2018-06-29 08:26:55
【问题描述】:

我正在尝试与 C# wcf 服务进行通信,该服务将 josn 作为输入,其中 json 包含图像数据,我编写了 C# 客户端,我在其中将包含图像的对象 (InputData) 作为字节 [] 转换为 json 并将其发送到服务器。

Client side:
 InputData  RequestData; //copied image data into RequestData obj 
 String jsonRequest = (new JavaScriptSerializer()).Serialize(RequestData); //converting obj to json

where : 
    public class InputData
    {
        private byte[] RawImage = null;
        public byte[] FrontImage 
        {
            get return this.FrontRawImage;
            set if (null != value) { FrontRawImage = value.ToArray(); }
         }
     }


Server side: 
       //deserialize and get the object 
       InputData requestData = JsonConvert.DeserializeObject<InputData>(jsonData);

我可以使用 C# 客户端执行此操作,但问题是,我必须从 C++ 客户端通信此 WCF 服务,我将图像(jpg)数据转换为字符串**(utf-8)**,然后创建json 并将其发送到服务但在服务器端我无法将此 json 反序列化为 InputData 对象(返回 null 并带有异常意外字符)。

//我在服务器端收到一个异常,提示“请求的数据中有意外字符” InputData requestData = JsonConvert.DeserializeObject(jsonData);

我在服务器端调试 => 来自 c# 客户端的 json 请求数据看起来像

"{\"Image\":[92,34,92,34,36,73, 56.......这里有大量的图像数据]}"

其中 [92,34,92,34,36,73, 56.......这里是巨大的图像数据] 是 json 中的实际图像数据。

但是当我从 c++ 发送相同的请求数据时,它看起来像

"{\"图像\": ÉGÉìÉRÅ[ÉfÉBÉ.........数据}"

所以在这里我在使用

反序列化 json 数据时遇到错误
InputData requestData = JsonConvert.DeserializeObject<InputData>(jsonData);

当请求来自 c++ 时,为什么我无法将数据反序列化回对象?

您能否告诉我一种将图像数据作为字符串发送到 C++ 中的 wcf 服务的方法,该服务可以成功地将数据反序列化回对象。

有没有一种方法可以在 C++ 中将我的图像数据转换为 [92,34,92,34,........] 这样服务器可以正确反序列化数据(我可能是错误)。

提前致谢。

【问题讨论】:

    标签: c++ string wcf utf-8 json-deserialization


    【解决方案1】:

    wcf 使用DataContract 来序列化。但是您尝试使用newtonsoft 序列化输入。如果你想序列化输入,你可以使用这个方法:

    public static string ToJSON<T>(this T obj) where T : class
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream stream = new MemoryStream())
        {
            serializer.WriteObject(stream, obj);
            return Encoding.Default.GetString(stream.ToArray());
        }
    }
    

    为了避免此类问题,我强烈建议使用 base64 而不是字节数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多