TFS 2010:当我可以使用XamlReader进行反序列化时,为什么无法使用XamlWriter.Save反序列化Dictionary
public static string GetXml(Dictionary parameters) { return XamlWriter.Save(parameters); }
上面的语句返回NotSupportedException
。
奇怪的是我可以使用XamlReader
来序列化字典。
public static Dictionary GetParameters(IBuildDetail buildDetail, string buildDefinition) { var tfsProject = buildDetail.BuildDefinition.TeamProject; var buildServer = buildDetail.BuildServer; var buildDef = buildServer.GetBuildDefinition(tfsProject, buildDefinition); using (var stringReader = new StringReader(buildDef.ProcessParameters)) { using (var xmlTextReader = new XmlTextReader(stringReader)) { return (Dictionary) XamlReader.Load(xmlTextReader); } } }
XML:
$(BuildDefinitionName) 6.0.0$(Rev:.r) Never False False False False True True 6.0.0.0 6.0.0.B True C:\Program Files (x86)\LogicNP Software\Crypto Obfuscator For .Net 2011 R3\co.exe $/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj $/XXX/Product/Company.XXX.Common
我使用JetBrains dotPeek来了解Microsoft如何为TFS 2010 Workflow序列化和反序列化Dictionary
。
对于反序列化,他们使用: Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)
对于序列化,他们使用: WorkflowHelpers.SerializeProcessParameters(IDictionary
程序集: Microsoft.TeamFoundation.Build.Workflow.dll
我最初的问题是我在排队构建之前尝试添加IBuildRequest.ProcessParameters
值。
private static void SetProcessParametersForSubBuild(IBuildRequest buildRequest, Dictionary processParametersForSubBuild, IBuildDefinition buildDefinition) { var subBuildProcessParameters = WorkflowHelpers.DeserializeProcessParameters(buildDefinition.ProcessParameters); if (processParametersForSubBuild.Any()) { foreach (var processParameter in processParametersForSubBuild) { if (subBuildProcessParameters.ContainsKey(processParameter.Key)) { subBuildProcessParameters[processParameter.Key] = processParameter.Value; } else { subBuildProcessParameters.Add(processParameter.Key, processParameter.Value); } } buildRequest.ProcessParameters = WorkflowHelpers.SerializeProcessParameters(subBuildProcessParameters); } }
队列构建:
var queuedBuild = buildServer.QueueBuild(buildRequest);
是否必须使用XamlReader / XamlWriter? 如果没有 – 看看DataContractSerializer:
public static class SerializationExtensions { public static string Serialize(this T obj) { var serializer = new DataContractSerializer(obj.GetType()); using (var writer = new StringWriter()) using (var stm = new XmlTextWriter(writer)) { serializer.WriteObject(stm, obj); return writer.ToString(); } } public static T Deserialize (this string serialized) { var serializer = new DataContractSerializer(typeof(T)); using (var reader = new StringReader(serialized)) using (var stm = new XmlTextReader(reader)) { return (T)serializer.ReadObject(stm); } } }
(信用到https://stackoverflow.com/a/5941122/1246870 )