Utilizzare i tipi Protobuf

Poiché l'API Google Ads utilizza Protobuf come formato di payload predefinito, è importante conoscere alcuni tipi e convenzioni di Protobuf quando si utilizza l'API.

Campi facoltativi

Molti campi nell'API Google Ads sono contrassegnati come optional. In questo modo puoi distinguere i casi in cui il campo ha un valore vuoto rispetto ai casi in cui il server non ha inviato un valore per il campo. Questi campi si comportano come campi normali, tranne per il fatto che forniscono anche metodi aggiuntivi per cancellare il campo e per verificare se il campo è impostato.

Ad esempio, il campo Name dell'oggetto Campaign è contrassegnato come facoltativo. Quindi, puoi utilizzare i seguenti metodi per lavorare con questo campo.

// Get the name.
string name = campaign.Name;

// Set the name.
campaign.Name = name;

// Check if the campaign object has the name field set.
bool hasName = campaign.HasName();

// Clear the name field. Use this method to exclude Name field from
// being sent to the server in a subsequent API call.
campaign.ClearName();

// Set the campaign to empty string value. This value will be
// sent to the server if you use this object in a subsequent API call.
campaign.Name = "";

// This will throw a runtime error. Use ClearName() instead.
campaign.Name = null;

Tipi ripetuti

Un array di campi è rappresentato nell'API Google Ads come RepeatedField di sola lettura.

Un esempio è che il campo url_custom_parameters di una campagna è un campo ripetuto, quindi è rappresentato come RepeatedField<CustomParameter> di sola lettura nella libreria client .NET.

L'elemento RepeatedField implementa l'interfaccia IList<T>.

Esistono due modi per compilare un campo RepeatedField.

Versione C# precedente: aggiungere valori utilizzando il metodo AddRange

Di seguito è riportato un esempio.

Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
};

// Add values to UrlCustomParameters using AddRange method.
campaign.UrlCustomParameters.AddRange(new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
});

Versioni C# più recenti: utilizza la sintassi dell'inizializzazione delle raccolte

// Option 1: Initialize the field directly.
Campaign campaign = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Directly initialize the field.
    UrlCustomParameters =
    {
        new CustomParameter { Key = "season", Value = "christmas" },
        new CustomParameter { Key = "promocode", Value = "NY123" }
    }
};

// Option 2: Initialize using an intermediate variable.
CustomParameter[] parameters = new CustomParameter[]
{
    new CustomParameter { Key = "season", Value = "christmas" },
    new CustomParameter { Key = "promocode", Value = "NY123" }
}

Campaign campaign1 = new Campaign()
{
    ResourceName = ResourceNames.Campaign(customerId, campaignId),
    Status = CampaignStatus.Paused,
    // Initialize from an existing array.
    UrlCustomParameters = { parameters }
};

Uno dei tipi

Alcuni campi dell'API Google Ads sono contrassegnati come campi OneOf, il che significa che il campo può contenere tipi diversi, ma un solo valore per volta. Uno Uno dei campi è simile al tipo di unione in C.

La libreria .NET implementa i campi OneOf fornendo una proprietà per ogni tipo di valore che può essere contenuto in un campo OneOf e tutte le proprietà che aggiornano un campo classe condiviso.

Ad esempio, il campo campaign_bidding_strategy della campagna è contrassegnato come campo unico. Questa classe è implementata come segue (codice semplificato per brevità):

public sealed partial class Campaign : pb::IMessage<Campaign>
{
    object campaignBiddingStrategy_ = null;
    CampaignBiddingStrategyOneofCase campaignBiddingStrategyCase_;

    public ManualCpc ManualCpc
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpc ?
                (ManualCpc) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpc;
        }
    }

    public ManualCpm ManualCpm
    {
        get
        {
            return campaignBiddingStrategyCase_ == CampaignBiddingStrategyOneofCase.ManualCpm ?
                (ManualCpm) campaignBiddingStrategy_ : null;
        }
        set
        {
            campaignBiddingStrategy_ = value;
            campaignBiddingStrategyCase_ = CampaignBiddingStrategyOneofCase.ManualCpm;
        }
    }

    public CampaignBiddingStrategyOneofCase CampaignBiddingStrategyCase
    {
        get { return campaignBiddingStrategyCase_; }
    }
}

Poiché le proprietà OneOf condividono lo spazio di archiviazione, un compito può sovrascrivere un compito precedente, causando lievi bug. Ad esempio:

Campaign campaign = new Campaign()
{
    ManualCpc = new ManualCpc()
    {
        EnhancedCpcEnabled = true
    },
    ManualCpm = new ManualCpm()
    {

    }
};

In questo caso, campaign.ManualCpc ora è null poiché l'inizializzazione del campo campaign.ManualCpm sovrascrive la precedente inizializzazione di campaign.ManualCpc.

Conversione in altri formati

Puoi convertire facilmente gli oggetti protobuf in formato JSON e viceversa. Ciò è utile durante la creazione di sistemi che devono interfacciarsi con altri sistemi che richiedono dati in formati basati su testo come JSON o XML.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};
// Serialize to JSON and back.
string json = JsonFormatter.Default.Format(row);
row = GoogleAdsRow.Parser.ParseJson(json);

Puoi anche serializzare un oggetto in byte e viceversa. La serializzazione binaria è più efficiente in memoria e archiviazione rispetto al formato JSON.

GoogleAdsRow row = new GoogleAdsRow()
{
    Campaign = new Campaign()
    {
        Id = 123,
        Name = "Campaign 1",
        ResourceName = ResourceNames.Campaign(1234567890, 123)
    }
};
// Serialize to bytes and back.
byte[] bytes = row.ToByteArray();
row = GoogleAdsRow.Parser.ParseFrom(bytes);