由于其保护级别,C#错误'System.Text.Encoding.GetString(byte [])'无法访问

时间:2014-05-20 09:47:46

标签: c# .net serialization xml-serialization xmlserializer

我正在尝试使用silverlight 5和c#将Object转换为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; } 
    }  
}

包含类的主要功能是:

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();

        }

    }
}

有人可以帮我修复错误吗?

2 个答案:

答案 0 :(得分:4)

我认为silverlight没有overload由于某种原因只有byte[]

您只需使用another overloadindexcount

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

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

答案 1 :(得分:2)

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

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

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

如果必须使用byte[]版本,则可以使用不同的重载来指定数组的边界。另请注意,传入底层缓冲区可避免数据的第三个​​重复(即内存流中的基础byte[],从{{1}返回的临时byte[] },以及最终在ToArray()中的数据。

string