System.Text.Encoding.GetString(byte[])'由于其保护级别而无法访问

本文关键字:保护 于其 访问 GetString Encoding Text byte System | 更新日期: 2023-09-27 18:04:23

我正在尝试使用silverlight 5和c#将对象转换为xml,我有以下错误:

Error   1   'System.Text.Encoding.GetString(byte[])' is inaccessible due to its protection level    

对应的行:

 return utf8.GetString(mem.ToArray());

在我的Xml.cs类

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Xml.Serialization;
using System.IO;
using System.Text;
namespace SliderLastTry
{
    public static class Xml
    {
        public static string ToXml(this object objectToSerialize)
        {
            var mem = new MemoryStream();
            var ser = new XmlSerializer(objectToSerialize.GetType());
            ser.Serialize(mem, objectToSerialize);
            var utf8 = new UTF8Encoding();
            return utf8.GetString(mem.ToArray());
        }
    }
}

Paramter.cs是:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SliderLastTry
{
    public  class Parameter 
    { 
        public  string Name {get; set; } 
    }  
}

包含class的Main函数是:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SliderLastTry
{
    public static class ControlClass
    {
        public static void Main()
        {
            Parameter pram = new Parameter();
            pram.ToXml();
        }
    }
}

System.Text.Encoding.GetString(byte[])'由于其保护级别而无法访问

我猜silverlight没有超载,因为某种原因只需要byte[]

你只需要使用另一个过载,同时接受indexcount

var bytes = mem.ToArray();
return utf8.GetString(bytes, 0, bytes.Length);

FWIW GetString内部以同样的方式调用另一个重载:)

说实话,这里最好的选择是使用StringWriter,因为.NET string而不是直接映射到UTF-8(如果有的话,它实际上是UTF-16):

using(var writer = new StringWriter())
{
    ser.Serialize(writer, objectToSerialize);
    return writer.ToString();
}

这还具有避免所有数据的额外重复的性能优势(string vs byte[])。

如果必须使用byte[]版本,可以使用不同的重载来指定数组的边界。还要注意,传入底层缓冲区避免了数据的第三个副本(即内存流中的底层byte[],从ToArray()返回的临时byte[],以及最终在string中结束的数据)。

return utf8.GetString(mem.GetBuffer(), 0, (int)mem.Length);