Binary Serialization and BinaryFormatter with WebServices

2024-02-09 18:18

本文主要是介绍Binary Serialization and BinaryFormatter with WebServices,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.eggheadcafe.com/articles/20040721.asp
http://www.vckbase.com/document/viewdoc/?id=1239

  “Web 的语义不是一种分离,而是当前 Web 的延伸,信息在其中被赋予了定义良好的内涵,使计算机和人之间能更好地协同工作。”
——Sir Tim Berners-Lee

  最近我们碰到一些论坛贴子,其问题大概都是围绕着“如何通过 Web 服务(WebService)序列化和发送一幅图像”以及“BinaryFormatter 不 工作——出现编程序集版本异常”这样的话题。我觉得现在是时候用仔细斟酌过的例子代码来说明问题,而不是不断地重复回帖。本文中我创建了一个简单的 Web 服务,其中包含了两个方法:
  1. GetImage —— 它有一个字符串参数,用于接收图像文件名(采用 Server.MapPath),将图像从文件系统读进字节数组,然后 将该图像保存在一个简单的可序列化的类 ImageClas 的 public 类型字节数组属性“myImage”中。这个类就是该方法的返回类型。
  2. GetImageBytes —— 这个方法除了使用 BinaryFormatter 序列化 ImageClass 实例 并将得到的字节数组结果发送给调用者之外,其所做的事情与第一个方法完全一样。

  首先把我们的图像存储在一个类实例属性中并序列化完整的类具有显著优点,这样做我们至少除了图象本身之外,我们还可以在网络上序列化和发送 附加的信息。

上述两个 WebMothods 方法的实现细节如下:

[WebMethod]
public byte[] GetImageBytes(string strImageName)
{
ImageClass ic=new ImageClass();
FileStream fs = new FileStream(Server.MapPath(strImageName),
FileMode.OpenOrCreate, FileAccess.Read);

Byte[] img= new Byte[fs.Length ];
try
{
fs.Read(img, 0, Convert.ToInt32(fs.Length));
}

catch(Exception ex)
{
Debug.WriteLine(ex.Message+ex.StackTrace);
}

fs.Close();
ic.myImage=img;
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms,ic);
return ms.ToArray();
}

[WebMethod]
public ImageClass GetImage(string strImageName)
{
ImageClass ic=new ImageClass();
FileStream fs = new FileStream(Server.MapPath(strImageName),
FileMode.OpenOrCreate, FileAccess.Read);

Byte[] img= new Byte[fs.Length ];
try
{
fs.Read(img, 0, Convert.ToInt32(fs.Length));
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message+ex.StackTrace);
}

fs.Close();
ic.myImage=img;
return ic;
}
我们必须把 ImageClass 类放在一个由 WebServices 类(即调用者)引用的单独类库工程中,,这样我们便可以防止 BinaryFormatter “程序集”错误,因为当我们试图反序列化 Formatter 输出时,程序集名称,版本和文化信息都将会匹配。如果你试图将 ImageClass 类放在实际的 Web 服务项目中,那么将会给你带来本可以避免的令人头痛的问题。解决此种问题的方法同样适用远程接口——即必须把 可序列化的“东西或内容”放到某个单独的类库中。下面是 ImageClass 类的代码 :
using System;
using System.Reflection;
using System.Drawing;

namespace ImageClassAssy
{
[Serializable]
public class ImageClass
{
public byte[] myImage;
public ImageClass()
{
}
}
}
为了测试我们创建的 Web 服务,下面拟使用一个 Windows 窗体应用程序,此应用程序将使用一个 WebReference 来引用我们的 Web 服务,有两个按钮,每个按钮执行各自的方法,下面是每个按钮的各自代码:
private void button1_Click(object sender, System.EventArgs e)
{
// GetImage Method
BinaryFormatterSvc.Service1 s= new BinaryFormatterSvc.Service1();
BinaryFormatterSvc.ImageClass icc=s.GetImage(this.textBox1.Text);
byte[] byt=icc.myImage;
MemoryStream ms = new MemoryStream(byt);
Bitmap b=(Bitmap) Image.FromStream(ms);
pictureBox1.Image=b;
}

private void button2_Click(object sender, System.EventArgs e)
{
//GetImageBytes (BinaryFormatter) method
BinaryFormatterSvc.Service1 s= new BinaryFormatterSvc.Service1();
byte[] byt=s.GetImageBytes(this.textBox1.Text);
MemoryStream ms = new MemoryStream(byt);
BinaryFormatter bf= new BinaryFormatter();
ImageClass ic=(ImageClass)bf.Deserialize(ms);
MemoryStream ms2 = new MemoryStream(ic.myImage);
Bitmap b=(Bitmap) Image.FromStream(ms2);
pictureBox1.Image=b;
}
下面是方法调用后的结果,图片是我信手拿来的一张照片——在服务器上的一张名为“Pete.jpg”的图片:

这篇关于Binary Serialization and BinaryFormatter with WebServices的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694958

相关文章

uva 575 Skew Binary(位运算)

求第一个以(2^(k+1)-1)为进制的数。 数据不大,可以直接搞。 代码: #include <stdio.h>#include <string.h>const int maxn = 100 + 5;int main(){char num[maxn];while (scanf("%s", num) == 1){if (num[0] == '0')break;int len =

226 Invert Binary Tree

//226 Invert Binary Tree//算法思路:主要使用递归算法public class Solution {public TreeNode invertTree(TreeNode root) {//1 出口 空节点if (root==null)return null;//2 递归 调用自己TreeNode left = root.left;TreeNode right = ro

【python 调用webserver】python请求调用webservices接口方法

python webservice接口调用,可以用requests包发起post请求方式,此方法稍微区别是data是XML格式数据。 config.py from hashlib import md5import datetime# 请求地址url="http://10.66.3.19:6039/BaseDataService.asmx"# XML请求参数#时间戳# timeStamp

Spring之整合Apache CXF框架实现WebServices远程调用

基于Spring实现WebSerivces远程调用.底层基于soap传输协议,wsdl对象描述规范 依赖的jar包, cxf版本:apache-cxf-2.7.17 1.配置: applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.or

[LeetCode] 863. All Nodes Distance K in Binary Tree

题:https://leetcode.com/problems/all-nodes-distance-k-in-binary-tree/ 题目大意 求给树中,距给定 结点 指定长度的 所有结点的val 思路 tree -> graph 、 bfs 先遍历树,并用map记录每个结点的父结点 ,将树变为图,然后 bfs。 /*** Definition for a binary tree

LeetCode 67 Add Binary

题意: 两个二进制数相加,输出结果 思路: 各种模拟均可,比如先把A和B倒过来,再按位相加,最后把结果再倒回来。 不过为了快,我是这样做的——假设A比B长,那么我对位相加B的长度。这时如果没有进位,那么A长出B的部分就不会变了;如果有进位,那么继续往A的高位加,直到某一次进位为0,那么更高位的A就不变了;如果直到最后还有进位,那就最前面添加一个最高位1。 代码: cla

Classical Binary Search

Find any position of a target number in a sorted array. Return -1 if target does not exist. Example Example 1: Input: nums = [1,2,2,4,5,5], target = 2Output: 1 or 2 Example 2: Input: nums = [1,

Cousins in binary tree

Input: root = [1,2,3,null,4,null,5], x = 5, y = 4Output: true Input: root = [1,2,3,4], x = 4, y = 3Output: false 思路:就是level order traverse,BFS,记录一下parent, curNode, Depth; /*** Definition for

Average of Levels in Binary Tree

Input:3/ \9 20/ \15 7Output: [3, 14.5, 11]Explanation:The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11]. 思路:就是一个level order trav

Closest Leaf in a Binary Tree

Input:root = [1,2,3,4,null,null,null,5,null,6], k = 2Diagram of binary tree:1/ \2 3/4/5/6Output: 3Explanation: The leaf node with value 3 (and not the leaf node with value 6) is nearest to the no