使用C#调用Java的WebService用来传递图片,图片保存在MySql数据库中,采用MediumBlob类型(因为Blob类型最大为65K,我们的图片为4M,所以采用MediumBlod类型,最大支持16M),在实体类中采用的是byte[]数组。
开始时,图片没有做任何处理,从数据库中取出图片,放到byte数组中,然后通过JsonObject将byte[]数组进行序列化为json格式的字符串,将数据发送出去,结果在Java测试完全正确,当C#进行调用时,无法将byte数组转换为C#的byte数组。通过查找资料,原因如下:在java中,byte是有符号的,范围为-128~127,而C#中byte是无符号的,范围为0~255,所以将java的byte转换为C#中的byte时会出现问题,结果不正确。解决方法,将java中的byte数组转换为int数组,然后将int数组进行序列化,C#调用时,先解析为string字符串,再将该字符串转换为int类型的数组,最后转换为byte类型的数组,成图。
java端的代码如下,将byte数组转换为int数组:
// 从实体中获取byte数组
byte[] bytes = obj.getPic();
// 声明int类型数组
int[] data = new int[bytes.length];
// 将byte数组转换为int数组
for (int i=0; i<bytes.length; i++) {
data[i] = bytes[i] & 0xff;
}
// 序列化byte数组
JSONObject.fromObject(data).toString();
c#端调用代码,1)解析为string字符串 2)将字符串转换为int类型的数组3)将int类型的数组转换为byte类型的数组4)调用方法,生成图片
// 得到数组
Array tArr=tJObject["picture"].ToArray();
// 声明byte数组
Byte[] tByte = new Byte[tArr.Length];
// 将数组转换为int类型的数组,再转换为byte类型的数组
if (tArr != null && tArr.Length > 0)
{
for (int i = 0; i < tArr.Length; i++)
{
tByte[i] = (byte)int.Parse(tArr.GetValue(i).ToString());
}
}
// 赋值
byte[] imageBytes = tByte;
// 声明图片生成路径
tEcgTemplate.Picture = Properties.Settings.Default.FilePath + tEcgTemplate.Id + "_" + tEcgTemplate.MemberId + ".jpg";
// 生成图片
System.IO.File.WriteAllBytes(tEcgTemplate.Picture, imageBytes);