当我将控件的位置导出为字符串时,使用标准的Control.Location.ToString方法,我得到以下内容:
{X=163,Y=196}
如何将此字符串转回位置?是否有任何开箱即用的功能,或者我是否需要解析此字符串并自己完成?
更新: 我想将屏幕上的一些对象序列化为XML以保存进度并稍后再读回来。
答案 0 :(得分:1)
如果您要序列化,那么序列化器应该处理从Point
到字符串并返回的转换。如果检查序列化程序输出,它应如下所示:727, 97
。
此表单为InvariantString
,NET提供了转换这些表单的方法,而无需解析文本:
Dim pt = Button10.Location
Dim cvtr = TypeDescriptor.GetConverter(GetType(Point))
' convert Pt to invariant string
Dim strPT = cvtr.ConvertToInvariantString(pt)
Console.WriteLine(strPT)
' try to convert back
Dim pt2 = DirectCast(cvtr.ConvertFromInvariantString(strPT), Point)
If pt.Equals(pt2) Then
Console.Beep()
End If
输出:
727,97
(哔)
但同样,序列化程序应该为你转换。
如果您正在做很多这样的事情,通用版本很方便:
Private Function CvtToInvariantString(Of T)(item As T) As String
Dim cvtr = TypeDescriptor.GetConverter(GetType(T))
Return cvtr.ConvertToInvariantString(item)
End Function
Private Function CvtFromInvariantString(Of T)(str As String) As T
Dim cvtr = TypeDescriptor.GetConverter(GetType(T))
Return DirectCast(cvtr.ConvertFromInvariantString(str), T)
End Function
用法:
Dim strPT = CvtToInvariantString(pt)
Dim pt2 = CvtFromInvariantString(Of Point)(strPT)