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

をデシリアライズするためにXamlReaderを使用することができるときXamlWriter.Saveと辞書<文字列、オブジェクト>をデシリアライズすることはできません。TFS 2010:なぜそれは私が上記の文は<code>NotSupportedException</code>を返し

私は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:それはXamlReader/XamlWriterを使用するために必要不可欠

<?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

私は、MicrosoftがTFS 2010のワークフローのためのDictionary<string, object>のシリアライズとデシリアライズする方法を見つけるためにJetBrains dotPeekを使用。彼らが使用するデシリアライズするために

Microsoft.TeamFoundation.Build.Workflow.WorkflowHelpers.DeserializeProcessParameters(string parameterValues)

彼らが使用するシリアル化する: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); 
    } 
} 

キュービルド:

するvar queuedBuild = buildServer.QueueBuild(buildRequest)。

1

のですか?そうでない場合 - DataContractSerializerを見てみましょう:(https://stackoverflow.com/a/5941122/1246870へクレジット)

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); 
     } 
    } 
} 

+0

いいえ、必須ではありませんが、同じスキーマを取得する必要があります。 DataContractSerializerを使用すると、スキーマが変更されます。 – Rookian

関連する問題