`

WinRT中的流和.NET中的Stream的相互转换以及DataReader,DataWriter用法

 
阅读更多

      随着Windows8的发布,微软给出了一个Windows Runtime(以下简称WinRT),据说是用COM技术实现的。在结合使用.NET和WinRT时,你会发现它们对相同的概念,有不同的实现,或者说是类,比如异步操作,.NET中用Task概念,而WinRT则是用IAsyncInfo,IAsyncAction等,而在流的概念中,.NET围绕Stream类建立,而WinRT则先定义了三个主要的接口,然后逐一实现之。本文就是集中在“流”的相互转换上,因为你在编写Metro App时,会用到WinRT组件。

      首先,.NET的Stream可谓是集读、写以及流定位于一身的一个类,那么在WinRT中则将它抽象成三个不同的接口,分别为:IInputStream、IOutupStream和IRandomAccessStream,其实这三个接口就是对应Stream所提供的功能。当然还有别的接口,这里暂不介绍。还有一个要介绍的是IBuffer,这个接口提供了对我们传统放置字节数组的byte[]的抽象,而且只提供了Capcity和Length两个属性(没有方法),Capcity是说这个IBuffer能够容纳多少字节,而Length则说明实际有多少字节,WinRT中也会有一个实现了该接口的类,称为Buffer,我们使用输入输出流时,都会用到。

     然后,我们在转换时,最好加入System.IO命名空间,这个空间提供了我们需要的转换的扩展方法。

1. 将IBuffer转换成一个.NET Stream:

由于已经知道了一个字节块(IBuffer),那么我们可以把它放入到一个内存的随机访问流中,就是从Buffer中读取byte到内存流中(InMemoryRandomAccessStream,它实现了上诉的三大接口),再通过扩展方法转换成Stream,代码如下

 InMemoryRandomAccessStream memoryStremWRT = new InMemoryRandomAccessStream();
            await memoryStremWRT.ReadAsync(buffer,buffer.Length,InputStreamOptions.None);
            Stream stream = memoryStremWRT.AsStream();

 2.将一个IOutputStream转换成为Stream:

 stream = outputStream.AsStreamForWrite();

 

3.将一个IInputStream转换成Stream:

 stream = inputStream.AsStreamForRead();

 

4.将IRandomAccess转换成Stream:

stream=randomAccess.AsStream();

 

5.Stream 转成Buffer:

由于buffer需要读取数据,所以要一个输入流,此处使用DataReader来加载,它的构造参数就是一个输入流。

IBuffer buffer=null;
var inputstream=stream.AsInputStream();
using(var dataReader=new DataReader(inputstream))
{
      await dataReader.LoadAsync((uint)stream.Length);
      buffer=dataReader.DetachBuffer();
}

 

6.Stream 转成IIputStream

var inputstream=stream.AsInputStream();

 

7.Stream转成IOutputStream

var outputstream=stream.AsOutputStream();

8.Stream转成 IRandomAccess:

此处没有直接提供扩展方法,所以我们的思路还是先构造出一个输入流来获取数据:

IBuffer buffer=null;
var inputstream=stream.AsInputStream();
using(var dataReader=new DataReader(inputstream))
{
      await dataReader.LoadAsync((uint)stream.Length);
      buffer=dataReader.DetachBuffer();
}
var randomAccessStream =new InMemoryRandomAccessStream ();
await randomAccessStream.WriteAsync(buffer);

 

 

以上用到了DataReader类,对应的还有DataWriter类,这两个类和.NET中的StreamReader和StreamWriter的用法和概念一样,使用了适配器模式,将我们平时用到的类型,比如文本啊,整形数据啊,输入到流或者从流中读出,那么底层的字符,或者整形与byte之间的转换就不需要我们操心了,最多我们要指明是用大端还是小端表示,或者使用什么字节编码。

      对于DataReader的含义,就是说我们要从一个输入流中读取数据(数据源是输入流,目标是从流中组装的具体变量值),至于数据的具体含义,那么就看你自己的需求了,一般情况下你是知道流到底是应该编码成string,还是组成int,long,亦或是两者都有,只要顺序搞对就行。

      对于DataWriter的含义,则与Reader相对,就是我们输入我们需要的数据,无论是byte,还是string 还是int,long,经过适度的编码以及分解,然后输出到一个流中。

以上的参考代码如下:

 // Initialize the in-memory stream where data will be stored.
    using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
    {
        // Create the data writer object backed by the in-memory stream.
        using (var dataWriter = new Windows.Storage.Streams.DataWriter(stream))
        {
            dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
            dataWriter.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

            // Parse the input stream and write each element separately.
            string[] inputElements = ElementsToWrite.Text.Split(';');
            foreach (string inputElement in inputElements)
            {
                uint inputElementSize = dataWriter.MeasureString(inputElement);
                dataWriter.WriteUInt32(inputElementSize);
                dataWriter.WriteString(inputElement);
            }

            // Send the contents of the writer to the backing stream.
            await dataWriter.StoreAsync();

            // For the in-memory stream implementation we are using, the flushAsync call 
            // is superfluous,but other types of streams may require it.
            await dataWriter.FlushAsync();

            // In order to prolong the lifetime of the stream, detach it from the 
            // DataWriter so that it will not be closed when Dispose() is called on 
            // dataWriter. Were we to fail to detach the stream, the call to 
            // dataWriter.Dispose() would close the underlying stream, preventing 
            // its subsequent use by the DataReader below.
            dataWriter.DetachStream();
        }

        // Create the input stream at position 0 so that the stream can be read 
        // from the beginning.
        using (var inputStream = stream.GetInputStreamAt(0))
        {
            using (var dataReader = new Windows.Storage.Streams.DataReader(inputStream))
            {
                // The encoding and byte order need to match the settings of the writer 
                // we previously used.
                dataReader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                dataReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

                // Once we have written the contents successfully we load the stream.
                await dataReader.LoadAsync((uint)stream.Size);

                var receivedStrings = "";

                // Keep reading until we consume the complete stream.
                while (dataReader.UnconsumedBufferLength > 0)
                {
                    // Note that the call to readString requires a length of "code units" 
                    // to read. This is the reason each string is preceded by its length 
                    // when "on the wire".
                    uint bytesToRead = dataReader.ReadUInt32();
                    receivedStrings += dataReader.ReadString(bytesToRead) + "\n";
                }

                // Populate the ElementsRead text block with the items we read 
                // from the stream.
                ElementsRead.Text = receivedStrings;
            }
        }

 

分享到:
评论

相关推荐

    Newtonsoft.Json.dll .net2.0~4.0 WindowsPhone WinRT

    它支持多种.NET框架,包括 .NET 2.0 至 .NET 4.0,以及Windows Phone和WinRT平台,这使得它在各种应用场景下都能发挥出强大的作用。 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和...

    windows RT开发笔记_WinRT DLL及其调用研究

    在Windows RT开发中,WinRT DLL的出现是为了在Windows应用商店应用(Windows Store Application)中兼容和复用传统的Win32 DLL。Windows RT是Windows Runtime的简称,它是一个跨语言的运行时环境,旨在为Windows 8及...

    如何从.NET桌面应用程序调用WinRT API

    在.NET桌面应用程序中调用WinRT(Windows Runtime)API是一个重要的技术话题,特别是在Windows 8及更高版本操作系统中。WinRT API是微软为构建现代化、触摸友好的Windows应用而设计的一种编程接口,它允许开发者利用...

    Newtonsoft.Json.Net 包括: .NET 2, .NET 3.5, .NET 4, .NET 4.5

    Newtonsoft.Json.Net 包括: .NET 2, .NET 3.5, .NET 4, .NET 4.5, Silverlight, Windows Phone and Windows 8 Store,所有dll文件和源码,有需要的同学可以直接下载。 个人网站多多支持:www.mlyuansu.com

    WinRT.揭秘

    3. **第三章:使用.NET开发WinRT应用**:本章重点介绍了如何结合.NET框架开发WinRT应用。这是一门实用性强的技术,适合那些熟悉.NET的开发者。书中不仅讲解了如何将.NET与WinRT相结合,还提供了许多实际案例,帮助...

    vlc-winrt-master.zip

    WinRT是一种面向Windows 8及以上版本的API,它允许开发者使用.NET Framework、C++/CX、JavaScript等语言来编写现代UI风格的应用。VLC的WinRT版本需要考虑如何在这些限制下实现跨平台的多媒体功能,这包括如何处理...

    Newtonsoft.Json.Net2.0 .net3.5 .net4.0 .net4.5.rar

    Newtonsoft.Json.Net2.0 .net3.5 .net4.0 .net4.5 包含Newtonsoft.Json.Net的各个版本.net2.0、.net3.5、.net4.0、.net4.5、Portable、Portable40、WinRT。Newtonsoft .Json.dll 在C#中使用格式化json特别方便。

    Newtonsoft.Json专为.Net 2.0、3.5、4.0和4.5

    在.NET 2.0、3.5、4.0和4.5版本中,Newtonsoft.Json提供了一致且高效的API,允许开发者将C#对象转换为JSON字符串,同时也能够将JSON文本解析为.NET对象。这一特性对于跨平台开发尤其有用,因为JSON已经成为Web API和...

    .net开发精粹

    - **Windows Media Capture**: 使用`Windows.Media.Capture`命名空间中的类和方法来捕获摄像头的图像或者视频,相比传统的Windows API来说,这种方式更加直观和简单。 #### 三、WinRT与.NET之间的映射 1. **数据...

    win8 metro 调用 winRT dll (包括C文件和cpp文件)

    WinRT API是原生代码和托管代码都可以使用的,支持C++, C#, VB.NET等多种语言。在Windows 8 Metro应用中,如果你需要调用WinRT API,可能会遇到一些特定的挑战,特别是在涉及到C文件时。下面将详细解释如何在C文件中...

    C#解析json的Newtonsoft.Json.dll各种.net版本

    这个库由James Newton-King 开发,它为C#开发者提供了丰富的功能,便于序列化和反序列化JSON,使得JSON数据在.NET应用中的使用变得极其简单。 Newtonsoft.Json.dll库支持多种.NET框架版本,包括.NET Framework 2.0...

    .net4.5.2 framework安装包

    在.NET 4.5.2中,这些类库得到了进一步优化和扩展,以适应新的开发需求和技术趋势,比如更好的异步编程支持和改进的Web服务API。 .NET Framework 4.5.2 还引入了对Windows 8应用的支持,这包括对WinRT(Windows ...

    winrt-via-csharp代码

    .NET Framework中的Stream类是处理数据流的基础,无论是文件、网络还是内存数据。这部分代码将展示如何使用C#的Stream类进行数据读写,实现高效的I/O操作。 10. **Collateral文件** "_Collateral"可能包含项目的...

    GMap.NET下载离线地图下载即用谷歌百度腾讯高德

    GMap.NET是一个强大的开源.NET框架,它为开发者提供了一种集成全球定位系统(GPS)功能的方式,特别是用于在Windows Forms、WPF、WinRT、Silverlight以及ASP.NET应用程序中显示地图。这个框架支持多种在线地图服务,...

    .NET Framework 4.5安装包.zip

    6. **WCF和WF改进**:Windows Communication Foundation (WCF)和Windows Workflow Foundation (WF)在4.5中得到了优化,提高了服务和工作流的性能,并简化了配置。 7. **ASP.NET增强**:ASP.NET 4.5引入了Web Forms...

    GMap.net的WPF实现demo

    在本文中,我们将深入探讨如何在WPF应用中使用GMap.NET进行地图展示和交互。 首先,要在WPF项目中使用GMap.NET,你需要通过NuGet包管理器安装`GMap.NET.WPF`包。安装完成后,引入必要的命名空间: ```xml xmlns:...

    GMAP.net 默认高德地图

    GMap.NET 是一个开源的 .NET 库,它提供了在 Windows Forms、WPF、WP7、Windows 8、 Silverlight 和 WinRT 平台上使用不同地图服务的能力,其中包括 Google Maps、Bing Maps 以及高德地图等。 描述中的 "GMAP.net ...

    BV_FileReadWrite

    `StorageFile`的`OpenStreamForReadAsync`和`OpenStreamForWriteAsync`方法可以返回`Stream`对象,允许你使用.NET Framework的`FileStream`、`StreamReader`和`StreamWriter`等类。 8. **文件监控**:通过`...

    .net framework 4.0 这个上传错了

    5. **ASP.NET 4.0**:更新了Web Forms、MVC和Ajax框架,增强了网页开发的灵活性和性能,引入了新的路由引擎,以及更强大的控件和配置选项。 6. **ADO.NET Entity Framework**:数据库访问框架得到了增强,支持更...

Global site tag (gtag.js) - Google Analytics