2012-03-06 18 views
7
public static string GetXml(Dictionary<string, object> parameters) 
{ 
    return XamlWriter.Save(parameters); 
} 

ऊपर बयान देता है एक NotSupportedException के लिए XamlReader का उपयोग कर सकते है।TFS 2010: क्यों यह संभव नहीं XamlWriter.Save के साथ एक शब्दकोश <स्ट्रिंग, वस्तु> deserialize करने के लिए जब मैं deserializing

अजीब बात यह है कि मैं XamlReader का उपयोग किसी शब्दकोश को क्रमबद्ध करने के लिए कर सकता हूं।

public static Dictionary<string, object> 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<string, object>) XamlReader.Load(xmlTextReader); 
     } 
    } 
} 

एक्सएमएल:

<?xml version="1.0" ?> 
<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <mtbwa:BuildSettings ProjectsToBuild="$/XXX/Product/Company.XXX.Common/Company.XXX.Common.Basic/Company.XXX.Common.Basic.csproj" x:Key="BuildSettings"> 

    <mtbwa:BuildSettings.PlatformConfigurations> 

     <mtbwa:PlatformConfigurationList Capacity="4"> 

     <mtbwa:PlatformConfiguration Configuration="DEMO" Platform="AnyCPU"/> 

     <mtbwa:PlatformConfiguration Configuration="Release" Platform="AnyCPU"/> 

     </mtbwa:PlatformConfigurationList> 

    </mtbwa:BuildSettings.PlatformConfigurations> 

    </mtbwa:BuildSettings> 

    <mtbwa:TestSpecList Capacity="0" x:Key="TestSpecs"/> 

    <x:String x:Key="BuildNumberFormat"> 
    $(BuildDefinitionName) 6.0.0$(Rev:.r) 
    </x:String> 

    <mtbwa:CodeAnalysisOption x:Key="RunCodeAnalysis"> 
    Never 
    </mtbwa:CodeAnalysisOption> 

    <mtbwa:AgentSettings MaxWaitTime="00:15:00" TagComparison="MatchExactly" Tags="" x:Key="AgentSettings"/> 

    <x:Boolean x:Key="AssociateChangesetsAndWorkItems"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="CreateWorkItem"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="PerformTestImpactAnalysis"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="CreateLabel"> 
    False 
    </x:Boolean> 

    <x:Boolean x:Key="DisableTests"> 
    True 
    </x:Boolean> 

    <x:Boolean x:Key="DoCheckinAssemblyInfoFiles"> 
    True 
    </x:Boolean> 

    <x:String x:Key="AssemblyVersionPattern"> 
    6.0.0.0 
    </x:String> 

    <x:String x:Key="AssemblyFileVersionPattern"> 
    6.0.0.B 
    </x:String> 

    <x:Boolean x:Key="UseObfuscation"> 
    True 
    </x:Boolean> 

    <x:String x:Key="ObfuscatorFilePath"> 
    C:\Program Files (x86)\LogicNP Software\Crypto Obfuscator For .Net 2011 R3\co.exe 
    </x:String> 

    <x:String x:Key="ObfuscatorProjectFile"> 
    $/XXX/Product/BuildProcess/Company.XXX.ZZZ.obproj 
    </x:String> 

    <x:String x:Key="ProjectPath"> 
    $/XXX/Product/Company.XXX.Common 
    </x:String> 

</Dictionary> 

उत्तर

2

मैं पता लगाने के लिए माइक्रोसॉफ्ट serializing और TFS 2010 कार्यप्रवाह के लिए एक Dictionary<string, object> deserializing है JetBrains dotPeek इस्तेमाल किया।

deserializing के लिए वे का उपयोग करें:Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

वे Serializing के लिए उपयोग करें:WorkflowHelpers.SerializeProcessParameters(IDictionary<string, object> parameterValues)

विधानसभा: Microsoft.TeamFoundation.Build.Workflow.dll

मेरी मूल समस्या यह है कि था मैंने निर्माण को कतार देने से पहले IBuildRequest.ProcessParameters मान जोड़ने की कोशिश की।

private static void SetProcessParametersForSubBuild(IBuildRequest buildRequest, Dictionary<string, object> 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); 
    } 
} 

कतार बिल्ड:

वर queuedBuild = buildServer.QueueBuild (buildRequest);

1

यह XamlReader/XamlWriter उपयोग करने के लिए बहुत जरूरी है? नहीं है - DataContractSerializer पर एक नज़र डालें:

public static class SerializationExtensions 
{ 
    public static string Serialize<T>(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<T>(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 को क्रेडिट)

+0

नहीं, यह आवश्यक नहीं है, लेकिन यह एक ही स्कीमा प्राप्त करना आवश्यक है। DataContractSerializer का उपयोग स्कीमा को बदलता है। – Rookian