C#Xml,json解析以及Socket传输问题

来源:互联网 发布:adobe cs3 mac 破解版 编辑:程序博客网 时间:2024/06/04 00:26

由于最近写了一个C#小项目,特此来总结下c#的常见问题

1.xml解析

 <span style="white-space:pre"></span>    XmlDocument xmlDoc = new XmlDocument();            XmlReaderSettings settings = new XmlReaderSettings();            settings.IgnoreComments = true;//忽略文档里面的注释                     XmlReader reader = XmlReader.Create(@"..\..\Common\Dict.xml", settings);            xmlDoc.Load(reader);               XmlNode xn = xmlDoc.SelectSingleNode("Dictionary");            XmlNodeList xnl = xn.ChildNodes;            foreach (XmlNode xnf in xnl)            {                XmlElement xe = xnf as XmlElement;
将xml文件读取到字典里

2.json解析

这里给大家说一个很简单的方法

点击vs的工具-----》NuGet包管理器--------》程序包管理器控制台

这下在控制台中输入install-package newtonsoft.json
就是导入一个newtonsoft.json包他是.NET中开源的JSon序列化和反序列化类库

json字符串反序列化为类

DiskFolder folder = JsonConvert.DeserializeObject<DiskFolder>(sendinfo[1])

而类序列化为字符串则更简单

message = JsonConvert.SerializeObject(diskfolder);

3.socket信息传输


手机客户端的发送与接收消息主要采用的DataReader和DataWriter类

DataReader常用函数

           public IBuffer ReadBuffer(System.UInt32 length);                 public void ReadBytes(System.Byte[] value);               public DateTimeOffset ReadDateTime();           public System.Double ReadDouble();              public Guid ReadGuid();               public System.Int16 ReadInt16();                public System.Int32 ReadInt32();                public System.Int64 ReadInt64();             //     从输入流中读取浮点值。        public System.Single ReadSingle();             //     从输入流中读取字符串值。             public System.String ReadString(System.UInt32 codeUnitCount);               //     从输入流中读取时间间隔值。        public TimeSpan ReadTimeSpan();        //     从输入流中读取 16 位无符号整数。         public System.UInt16 ReadUInt16();               //     从输入流中读取 32 位无符号整数。               public System.UInt32 ReadUInt32();               //     从输入流中读取 64 位无符号整数。             public System.UInt64 ReadUInt64();


发送

<span style="color:#ff0000;"> </span> using (DataWriter writer = new DataWriter(socket.OutputStream))            {                try                {                    writer.WriteBytes(buffer);                    await writer.StoreAsync();      //提交数据                    await writer.FlushAsync();       //刷新数据                    writer.DetachStream();              //分离流                    writer.Dispose();                   //关闭                }                catch (Exception e)                {                    await new MessageDialog(e.Message).ShowAsync();                    socket.Dispose();                }            }

接收

  <span style="white-space:pre"></span>DataReader reader = new DataReader(stream.InputStream);                reader.InputStreamOptions = InputStreamOptions.Partial;     //异步读取                try                {                    await reader.LoadAsync(sizeof(Int64));      //从流中加载一个long长度的数据                    string length = reader.ReadString(sizeof(Int64));       //获取所加载的long长度的数据                    uint fileLength = Convert.ToUInt32(length);                     await reader.LoadAsync(fileLength);                     //从流中加载一个filelength长度的数据                    filebuffer = new byte[fileLength];                                  reader.ReadBytes(filebuffer);                           //获取所加载的数据

DataReader和DatatWriter之间只要发送接收格式的顺序正确(先发一个int字节的,接收时就要先接收一个int字节的),他们本质上操作的还是对数据流的操作即byte类型


还有一点应该注意的是,一般会把DataReader放在using里面,为了合理释放内存,但是在循环接收信息时,由于对象会被释放,则在第二次加载数据时会抛出异常:意思就是对象已被释放,所以在循环接收数据时,就不要放在using里面了

4.获取手机sd卡文件

此处使用类KnownFolders.,此类也可以获取到手机的音乐库,图片库

 <span style="white-space:pre"></span>            StorageFile file = null;                    StorageFolder storagefolder = KnownFolders.RemovableDevices;                    foreach (var f in await storagefolder.GetFoldersAsync())                    {                        foreach (var SDfolder in await f.GetFoldersAsync())                        {                            if (SDfolder.Name == "Downloads")                            {                                file = await SDfolder.CreateFileAsync("textfile.png", CreationCollisionOption.ReplaceExisting);                                File.WriteAllBytes(file.Path, filebuffer);                                break;                            }                        }                    }


以后如果忘了就可以看看今天写的博客了


2 0