我正在寻找一种简单的方法来序列化对象(在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标签中)吗?
在.NET/WCF/Windows服务中查找内存和句柄时,我注意到我无法解释的奇怪行为.这里的设置和分辨率.我正在寻找的是对观察到的行为的解释.
我安装了Windows服务.
我开始服务了.
我用事务性WCF调用调用了一个简单的方法(每个调用的新通道 - 没有缓存).
对于每次调用,大约2个句柄保留在内存中.
如果以下项目适用,则可以观察到:
ServiceBase.Run(servicesToRun);使用某种类型调用实例化XmlSerializer 之前.new XmlSerializer(typeof(string))或新发生XmlSerializer(typeof(XmlDocument)).不需要调用序列化.如果自定义类型只有一个字符串作为属性就足够了(任何地方都没有句柄!)我的代码已包含修复:
在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) 我目前正在阅读其中一个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变量怎么可能为空呢?
我试图匹配文件的某一端,其中"文件的某一端"可以超过多行.
我的正则表达式如下:
"\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,如果感兴趣的话.