【一周工作总结】循环调用接口,和一些Xml格式文件的解析。

上周五,项目组老大,给我提了一下有个关于WebService的项目。由于当时时间仓促,对项目的需求理解出现偏差,导致我做到周二晚,才知道做的东西是方向反了。没办法,只好加加班,努力赶出来了。

1、既然是要写服务,还要周期性调用,那必然就离不开Timer类的调用了。注意:是System.Timer命名空间下的而不是System.Thread下的。

(PS:Timer类的具体方法以及属性的介绍我就不详细介绍了,这些东西在这里都有详细介绍https://msdn.microsoft.com/zh-cn/library/system.timers.timer(v=vs.110).aspx)

使用Timer写定时器那是相当的方便的。

   //如果需要写日志的话,准备一个

   ConcurrentQueue<string> logQueue = new ConcurrentQueue<string>();//日志容器。
ConcurrentQueue<string> exQueue = new ConcurrentQueue<string>();//异常容器。

把日志放在这2个里面然后需要调用的时候再释放出来比较好,这样不容易出现一些线程占用的异常。



#region 定时器的编写

System.Timers.Timer mTimer=new System.Timers.Timer()  //声明Timer类。

mTimer.Interval=1000;//定时器间隔时间的编写。

mTimer.Elapsed+=new System.Timers.ElapsedEventHandler(mTimer_Elapsed);//每此到了时间间隔的时候便调用括号中的方法。

mTimer.AutoReset=true; //如果Timer应在每次间隔结束时引发 Elapsed 事件,则为 true;如果它仅在间隔第一次结束后引发一次 Elapsed 事件,则为 false默认值为true

    #endregion

接下来便是要写具体方法

private void mTimer_Elapsed(object sender,System.Timers.ElapsedEventArgs e)

{

try

{

 #region 写Log日志
                writelog = new StringBuilder();
                icnt = logQueue.Count;
                haveEx = false;
                for (int i = 0; i < icnt; i++)
                {
                    string ex;
                    logQueue.TryDequeue(out ex);
                    writelog.Append(ex);
                    writelog.Append("\r\n");
                    haveEx = true;
                }
                if (haveEx)
                {
                    LogWrite.Log(writelog.ToString());
                }


                writelog.Clear();
                writelog = null;
                #endregion

#region 写异常日志
                writelog = new StringBuilder();
                icnt = exQueue.Count;
                haveEx = false;
                for (int i = 0; i < icnt; i++)
                {
                    string ex;
                    exQueue.TryDequeue(out ex);
                    writelog.Append(ex);
                    writelog.Append("\r\n");
                    haveEx = true;
                }
                if (haveEx)
                {
                    LogWrite.Log(writelog.ToString(), "ExceptionCollection", "ErrorLog");
                }


                writelog.Clear();
                writelog = null;
                #endregion

//里面是具体想要定时实现的方法,如果有多个。可以使用线程池,

if (listRunTime.Contains(nowtime.ToString("HHmm")))
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(downloadAllDataFile), null);
                    ThreadPool.QueueUserWorkItem(new WaitCallback(SendBusStation), null);
                }

}

}

线程里调用的方法写成

private void downloadAllDataFile(object obj)

{

//具体方法

}

2、循环调用会使用了,接下来,便是解析接口了常见的接口穿过来的数据一般分为Xml,String型的XML字符串,byte[]文件还有Json以上4种

2.1、如果得到的是XML格式文件则需要先转换为字符串格式,然后再进行解析,常见的解析是把XML格式的东西放在DataSet里。

XMLNode xmlnode=接口方法所返回的XML流。

string xmlString=xmlnode.InnerXml;

2.2、如果得到的是String型的字符串可以用XmlDocument类进行解析。

XmlDocument xmldoc=new XmlDocument()

xmldoc.LoadXml(xmlString);

string xml=xmldoc.InnerXml;

//存储XmlString

xmldoc.Save(filename+".xml");

2.3、如果得到的是byte[] bytes 可以通过Ecording类解析

string xml=Ecording.UTF8.GetString(bytes);

//转换后有可能会出   1行1列根目录下出现错误这样的BUG,其实这是因为有些隐藏的转换字符\n\r。

xml = " < "+xml.Substring(xml.IndexOf('<')+1);

PS:存储byte[] bytes文件

string xmlPath=AppDomain.CurrentDomain.BaseDirectory+"文件夹名字"+"\\"+DateTime.Now.ToString("yyyy-MM-dd")+"\\";

if (!Directory.Exists(xmlPath))
{
Directory.CreateDirectory(xmlPath);
}

//存储Xml文件

FileStream filestream = new FileStream(xmlPath + DateTime.Now.ToString("HHmmss") + ".xml", FileMode.Create);
filestream.Write(bytes, 0, bytes.Length);
filestream.Flush();
filestream.Close();

2.4、Json型。我的这个项目没有Json型的数据,所以这个可以用来先了解一下。

解析Json用的主要类
主要类命名空间限制内建LINQ支持
DataContractJsonSerializerSystem.Runtime.Serialization.Json通用
JavaScriptSerializerSystem.Web.Script.Serialization只能在web环境中使用
JsonArrayJsonObjectJsonValueSystem.Json只能在Silverlight中使用
JsonConvertJArrayJObjectJValueJPropertyNewtonsoft.Json通用

准备数据:

实体类:

[DataContract]

public class Person

{

[DataMember(Order = 0,IsRequired = true)]

public string Name { get; set; }

[DataMember(Order = 1)]

public int Age { get; set; }

[DataMember(Order = 2)]

public bool Alive { get; set; }

[DataMember(Order = 3)]

public string[] FavoriteFilms { get; set; }

[DataMember(Order = 4)]

public Person Child { get; set; }

}

定义:

Action<object> log = o => Console.WriteLine(o);

Func<int, int, int> add=(x, y) => x + y;

var p1 = new Person {

Age = 12,

Alive = true,

Name = "lj",

FavoriteFilms = new[] {"up", "Avatar"}

};

var p2 = new Person() { Age = 28, Name = "cy", Child = p1 };

使用DataContractJsonSerializer
帮助类:
     // using System.Runtime.Serialization.Json;

/// <summary>
/// 解析JSON,仿Javascript风格
/// </summary>

public static class JSON
{
public static T parse<T>(string jsonString)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);

}

}
public static string stringify(object jsonObject)

{

using (var ms = new MemoryStream())
{
new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
return Encoding.UTF8.GetString(ms.ToArray());
            }

}

}

用法:

// 序列化
var jsonString = JSON.stringify(new[] { p1, p2 });
log(jsonString == JSON.stringify(new List<Person>() { p1, p2 }));   //true
log(jsonString);
// 反序列化,泛型集合
JSON.parse<List<Person>>(jsonString);
// 数组转换            
JSON.parse<Person[]>(jsonString);

输出:

[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null
},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj",
"Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]

使用JavaScriptSerializer

// using System.Web.Script.Serialization;
    
var jser    = new JavaScriptSerializer();
    var json    = jser.Serialize(new List<Person>() { p1, p2 });
    var persons = jser.Deserialize<List<Person>>(json);

使用Silverlight

//using System.Json
     var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";
     var style = JsonObject.Parse(css) as JsonObject;    
     (
from s in style
where s.Key == "color"
select (string)s.Value
).First().ToString();
// "cyan"
    
     // 更多操作
style["layout"][0] = 22;
     var hd = style["#header"];
    style["body>div+p"] = hd;
    style.Remove("#header");
    
var bd = new JsonObject();
bd["border"] = "1px solid cyan";
style["body>div+p"]["#meta"] = bd;
style.ToString();
// {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}

使用JSON.NET

// using Newtonsoft.Json;
    
var json = JsonConvert.SerializeObject(new[] { p1, p2 });
var persons = JsonConvert.DeserializeObject<List<Person>>(json);
var ja = JArray.Parse(jsonString);            
log(ja); //注意,格式化过的输出

3、把Xml字符串放入DataSet中

StringReader stream=new StringReader(xmlString);

XmlTextReader reader=new XmlTextReader(stream);

ds.ReadXml(reader);

//把数据放到ds中之后,接下来就是要么把ds中的数据直接传给datagridview,一般情况下是要对数据进行分别解析的。

//这里有个简单的方法,可以一次性把每个ds所含有的表中的数据传给实体类。(PS:实体类的属性名要跟ds中每个表中的列名对应,推荐含有数据最多的表,采用这样的方法)

//假设ds中有一个station表,而我也对应着Station表,所建了一个station类,里面的属性和列名一致,里面每个属性也都是一样的类型。

Station station=new Station();

Type type=typeof(Station);  //获取Station中所有的类型。

PropertyInfo[] propertys=type.GetProperties(BindingFlags.Public | BingdingFlags.Instance);  //通过反射拿到station中所有的public的属性。

foreach(PropertyInfo property in propertys)

{

if (int i = 0; i < ds.Tables["Station"].Columns.Count; i++)

{

if (ds.Tables["Station"].Columns[i].ToString() == property.Name)

                         {
                             if (!string.IsNullOrWhiteSpace(ds.Tables["Station"].Rows[0][property.Name].ToString()))
                             {
                                 property.SetValue(station, ds.Tables["Station"].Rows[0][property.Name].ToString(), null);
                             }
                             else
                             {
                                 property.SetValue(station, "空", null);  //如果该数据不存在,就为空。(可以根据自己的需求进行修改)
                             }

                         }

}

}

4、将文件转换为btye[]型

(1)private byte[] GetBytesPath(string strPath)
{
FileStream filereader = new FileStream(strPath, FileMode.Open, FileAccess.Read);
BinaryReader xmlReader = new BinaryReader(filereader);
byte[] bytes = xmlReader.ReadBytes((int)filereader.Length);
filereader.Flush();
filereader.Close();
return bytes;
}

(2)private byte[] GetBytesPath(string strPath)

{

string filePath = Server.MapPath("File/") + filename;
if (File.Exists(filePath))
{
try
{
FileStream s = File.OpenRead(filePath);
return ConvertStreamToByteBuffer(s);
}

catch (Exception)

{

return new byte[0];

}

}

else

{

return new byte[0];

}

}

/// <summary>
/// 将Stream流转为byte数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] ConvertStreamToByteBuffer(Stream s)
{
MemoryStream ms = new MemoryStream();
            int b;
            while ((b=s.ReadByte())!=-1)
            {
                ms.WriteByte((byte)b);
            }
            return ms.ToArray();
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值