小编Sta*_*eXV的帖子

使用StringWriter进行XML序列化

我正在寻找一种简单的方法来序列化对象(在C#3中).

我用Google搜索了一些例子,并得出了类似的结果:

MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, myObject);
string result = Encoding.UTF8.GetString(memoryStream .ToArray());
Run Code Online (Sandbox Code Playgroud)

读完这个问题之后我问自己,为什么不使用StringWriter?看起来容易得多.

XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();
Run Code Online (Sandbox Code Playgroud)

另一个问题是,第一个示例生成的XML我不能只写入SQL Server 2005 DB的XML列.

第一个问题是:在我之后需要它作为字符串时,是否有理由不使用StringWriter序列化Object?在google搜索时,我从未找到使用StringWriter的结果.

第二个当然是:如果你不应该使用StringWriter(无论出于何种原因),这将是一个好的和正确的方法?


加成:

正如两个答案已经提到的那样,我将进一步讨论XML到DB的问题.

写入数据库时​​,我得到以下异常:

System.Data.SqlClient.SqlException:XML解析:第1行,字符38,无法切换编码

对于字符串

<?xml version="1.0" encoding="utf-8"?><test/>
Run Code Online (Sandbox Code Playgroud)

我从XmlTextWriter中获取了字符串,然后将xml放在那里.这个没有用(手动插入DB).

之后我尝试使用encoding ="utf-16"手动插入(只是编写INSERT INTO ...),这也失败了.删除编码完全有效.在那个结果之后我切换回StringWriter代码并且瞧 - 它工作了.

问题:我真的不明白为什么.

在Christian Hayter:通过这些测试,我不确定我是否必须使用utf-16来写入数据库.不会将编码设置为UTF-16(在xml标签中)吗?

c# xml sql-server utf-8 xml-serialization

94
推荐指数
4
解决办法
14万
查看次数

为什么在调用ServiceHost.Open之前实例化XmlSerializer会产生内存和句柄泄漏

在.NET/WCF/Windows服务中查找内存和句柄时,我注意到我无法解释的奇怪行为.这里的设置和分辨率.我正在寻找的是对观察到的行为的解释.

我安装了Windows服务.
我开始服务了.
我用事务性WCF调用调用了一个简单的方法(每个调用的新通道 - 没有缓存).
对于每次调用,大约2个句柄保留在内存中.

如果以下项目适用,则可以观察到:

  1. 这是一个Windows服务; 不要将其作为控制台应用程序运行.
  2. 使用事务(仅测试单独的进程或机器)来调用WCF方法.
  3. ServiceBase.Run(servicesToRun);使用某种类型调用实例化XmlSerializer 之前.
  4. 类型是自定义类型.它不会发生new XmlSerializer(typeof(string))或新发生XmlSerializer(typeof(XmlDocument)).不需要调用序列化.如果自定义类型只有一个字符串作为属性就足够了(任何地方都没有句柄!)
  5. 使用ie SGen.exe创建静态XmlSerialization.dll不会产生此问题.

我的代码已包含修复: 在OnStart()中最早
使用XmlSerializer :

Program.cs中

WindowsService winSvc = new WindowsService();
ServiceBase[] servicesToRun = new ServiceBase[]{winSvc};                    
ServiceBase.Run(servicesToRun);
Run Code Online (Sandbox Code Playgroud)

WindowsService.cs

internal sealed class WindowsService : ServiceBase
{
    private ServiceHost wcfServiceHost = null;

    internal WindowsService()
    {
        AutoLog = true;
        CanStop = true;
        CanShutdown = true;
        CanPauseAndContinue = false;
    }

    internal void StartWcfService()
    {
        wcfServiceHost = new ServiceHost(typeof(DemoService));
        wcfServiceHost.Open();
    }

    protected …
Run Code Online (Sandbox Code Playgroud)

.net c# wcf windows-services xml-serialization

8
推荐指数
2
解决办法
743
查看次数

在Java中将long分配给Long

我目前正在阅读其中一个Android教程.我发现了一个表达式:

Bundle bundle = getIntent().getExtras();
Long longVariable = bundle.getLong(someId);
if( longVariable != null )
{
  //doSomething
}
Run Code Online (Sandbox Code Playgroud)

在API中查看Bundle.getLong后,我看到它返回一个long(原始).现在,我没有写Java很长一段时间,同时只有C#,但对象Long longVariable变量怎么可能为空呢?

java primitive android object type-conversion

4
推荐指数
1
解决办法
1939
查看次数

SingleLine Option的正则表达式问题和字符串结尾前的\n

我试图匹配文件的某一端,其中"文件的某一端"可以超过多行.

我的正则表达式如下:

"\s\w$" 
Run Code Online (Sandbox Code Playgroud)

我想做的事情:查找所有以空白字符结尾的文件,然后在文件的最后添加"人类可读字符".

Regex.IsMatch("arbitrarytext a\n",@"\s\w$")
Run Code Online (Sandbox Code Playgroud)

问题是它是否匹配以下字符串:

"arbitrarytext a\n"
Run Code Online (Sandbox Code Playgroud)

我也尝试过RegexOptions.SingleLine - 虽然这只应该改变点"."的匹配行为.

如何重写我的正则表达式,它仍然满足我的需要,但与上面给出的例子不符.

其次,我也有兴趣解释为什么它与这个例子相符.

使用:.Net 3.5 SP1,如果感兴趣的话.

.net c# regex

2
推荐指数
1
解决办法
2669
查看次数